use lib qw(変数名);は無理?
モジュールへのパスを設定するのに以下のようにすると
use lib qw($cmd_path);
Can't locate BL/FileIO.pm in @INC (@INC contains: $cmd_path /usr/lib/perl
のようにエラーになり、$cmd_path が展開されません。
use lib qw("$cmd_path");
use lib q"$cmd_path";
など色々試したのですが、ダメでした。
設定する方法はあるのでしょうか?
$cmd_path はベタ書きしかないのでしょうか?
蛇足ですが、
qq()は中の文字列をダブルクォートで括った場合と同じ意味、
qw()は中の文字列を半角スペースでsplitしたのと同じ効果(つまり配列が返る)です。
その用法は全く違います。
他にもqで始まる関数はいろいろあるので、この機会に勉強してみてください。
ちなみにuse libは配列の引数を必要とします。
この回答へのお礼
bgbgさん、参考になるページまで教えていただきありがとうございます。
もう少し勉強してみたいと思います。
このたびは、色々と教えていただきありがとうございました。
そのようになる原因は、No.2さんの仰ったとおり
・$cmd_path に「コンパイル時に」値が設定されていない
ということです。
useは他のプログラムよりも先駆けて実行されます。
つまり、$cmd_nameに値を入れるプログラム部分よりも先に実行されるので、use libする時の$cmd_nameの中身は空です。
これを解決するには、$cmd_nameに値を入れる処理部分を
BEGIN{
:
:
}
で囲みましょう。
BEGINで囲んだ処理がuseよりも上にあれば、useの実行前にBEGINの処理が行われます。
この回答への補足
すみません。
やはりTacosanのおっしゃるとおり、use lib qw( $cmd_path );でないとだめなようです。
BEGIN{ の中でunshift(@INC, $cmd_path);を設定していた為です。。
bgbgさん、Tacosanさん、全て解決しましたので、深くお礼申し上げます。<(_ _)>
この回答へのお礼
bgbgさん、Tacosanさん本当にありがとうございます。
解決しました。
おっしゃるとおりBEGINで囲みましたら問題なく動きました。
本当にありがとうございました。
追加で質問なのですが、
use lib qq( $cmd_path );
use lib qw( $cmd_path );
どちらでもエラーにはならないのですが、どちらを使用しても問題ないでしょうか?
何度も質問して申し訳ありませんがよろしくお願いいたします。
手元 (AcrivePerl 5.8.7) では qq を使えば展開できているので, そこは問題ないはずです.
問題が発生する, なるべく小さなプログラム (とそのプログラムを実行したときに表示される全てのメッセージ) を出してもらえると解決の手掛かりになるんですが....
まあ, 思い付くのは
・実は BL/FileIO.pm が存在しない
・$cmd_path に「コンパイル時に」値が設定されていない
くらいかなぁ.
この回答への補足
ちなみにperl5.8.7でも結果は同じでした。。
この回答へのお礼
ご回答ありがとうございます。
サンプルと実行結果を以下に書きます。
ちなみにBL/FileIO.pmは存在していて、
use lib qq( $cmd_path ); → use lib qw( /home2/account );
とベタにパスを書けば問題なく実行できるのです。
$cmd_pathにも中身が入っているのです。。
サンプル
-----------------------------------------
#!/usr/local/bin/perl
unless( $cmd_name ){
if($0 =~ /(.+)\/([^\/]+)/){
$cmd_path = $1;
$cmd_name = $2;
}else{
$cmd_path = '.';
$cmd_name = $0;
}
unshift(@INC, $cmd_path);
}
use lib qq( $cmd_path );
use BL::FileIO;
・・・
-----------------------------------------
実行結果
-----------------------------------------
Can't locate BL/FileIO.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/vendor_perl/5.6.1 /usr/lib/perl5/vendor_perl .) at /home2/account/test.pl line 15.
BEGIN failed--compilation aborted at /home2/account/test.pl line 15.
-----------------------------------------
q や qw は変数を展開しないのでダメ.
qq なら展開するはずです. つまり, ($cmd_path に適切な値が入っているのであれば)
use lib qq($cmd_path);
でいいはず.
この回答へのお礼
ご回答ありがとうございます。
use lib qq($cmd_path);
で早速試してみたのですが、
直前で$cmd_pathをプリントし、中身が入っているのに同じエラーになります。変数をダブルクォートで囲ってもダメでした。。
変数の中身入っているのに、なぜなのでしょうか。。
- 最新から表示
- |
- 回答順に表示













