- 締切済み
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 はベタ書きしかないのでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- bgbg
- ベストアンサー率53% (94/175)
蛇足ですが、 qq()は中の文字列をダブルクォートで括った場合と同じ意味、 qw()は中の文字列を半角スペースでsplitしたのと同じ効果(つまり配列が返る)です。 その用法は全く違います。 他にもqで始まる関数はいろいろあるので、この機会に勉強してみてください。 ちなみにuse libは配列の引数を必要とします。
- bgbg
- ベストアンサー率53% (94/175)
そのようになる原因は、No.2さんの仰ったとおり ・$cmd_path に「コンパイル時に」値が設定されていない ということです。 useは他のプログラムよりも先駆けて実行されます。 つまり、$cmd_nameに値を入れるプログラム部分よりも先に実行されるので、use libする時の$cmd_nameの中身は空です。 これを解決するには、$cmd_nameに値を入れる処理部分を BEGIN{ : : } で囲みましょう。 BEGINで囲んだ処理がuseよりも上にあれば、useの実行前にBEGINの処理が行われます。
お礼
bgbgさん、Tacosanさん本当にありがとうございます。 解決しました。 おっしゃるとおりBEGINで囲みましたら問題なく動きました。 本当にありがとうございました。 追加で質問なのですが、 use lib qq( $cmd_path ); use lib qw( $cmd_path ); どちらでもエラーにはならないのですが、どちらを使用しても問題ないでしょうか? 何度も質問して申し訳ありませんがよろしくお願いいたします。
補足
すみません。 やはりTacosanのおっしゃるとおり、use lib qw( $cmd_path );でないとだめなようです。 BEGIN{ の中でunshift(@INC, $cmd_path);を設定していた為です。。 bgbgさん、Tacosanさん、全て解決しましたので、深くお礼申し上げます。<(_ _)>
- Tacosan
- ベストアンサー率23% (3656/15482)
手元 (AcrivePerl 5.8.7) では qq を使えば展開できているので, そこは問題ないはずです. 問題が発生する, なるべく小さなプログラム (とそのプログラムを実行したときに表示される全てのメッセージ) を出してもらえると解決の手掛かりになるんですが.... まあ, 思い付くのは ・実は BL/FileIO.pm が存在しない ・$cmd_path に「コンパイル時に」値が設定されていない くらいかなぁ.
お礼
ご回答ありがとうございます。 サンプルと実行結果を以下に書きます。 ちなみに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. -----------------------------------------
補足
ちなみにperl5.8.7でも結果は同じでした。。
- Tacosan
- ベストアンサー率23% (3656/15482)
q や qw は変数を展開しないのでダメ. qq なら展開するはずです. つまり, ($cmd_path に適切な値が入っているのであれば) use lib qq($cmd_path); でいいはず.
お礼
ご回答ありがとうございます。 use lib qq($cmd_path); で早速試してみたのですが、 直前で$cmd_pathをプリントし、中身が入っているのに同じエラーになります。変数をダブルクォートで囲ってもダメでした。。 変数の中身入っているのに、なぜなのでしょうか。。
お礼
bgbgさん、参考になるページまで教えていただきありがとうございます。 もう少し勉強してみたいと思います。 このたびは、色々と教えていただきありがとうございました。