プロが教える店舗&オフィスのセキュリティ対策術

モジュールへのパスを設定するのに以下のようにすると
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 はベタ書きしかないのでしょうか?

A 回答 (4件)

蛇足ですが、


qq()は中の文字列をダブルクォートで括った場合と同じ意味、
qw()は中の文字列を半角スペースでsplitしたのと同じ効果(つまり配列が返る)です。
その用法は全く違います。
他にもqで始まる関数はいろいろあるので、この機会に勉強してみてください。

ちなみにuse libは配列の引数を必要とします。

参考URL:http://www.rfs.jp/sb/perl/05/01.html
    • good
    • 0
この回答へのお礼

bgbgさん、参考になるページまで教えていただきありがとうございます。
もう少し勉強してみたいと思います。
このたびは、色々と教えていただきありがとうございました。

お礼日時:2006/12/06 11:41

そのようになる原因は、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さん、全て解決しましたので、深くお礼申し上げます。<(_ _)>

補足日時:2006/12/06 11:12
    • good
    • 0
この回答へのお礼

bgbgさん、Tacosanさん本当にありがとうございます。
解決しました。

おっしゃるとおりBEGINで囲みましたら問題なく動きました。
本当にありがとうございました。

追加で質問なのですが、
use lib qq( $cmd_path );
use lib qw( $cmd_path );
どちらでもエラーにはならないのですが、どちらを使用しても問題ないでしょうか?
何度も質問して申し訳ありませんがよろしくお願いいたします。

お礼日時:2006/12/06 11:06

手元 (AcrivePerl 5.8.7) では qq を使えば展開できているので, そこは問題ないはずです.


問題が発生する, なるべく小さなプログラム (とそのプログラムを実行したときに表示される全てのメッセージ) を出してもらえると解決の手掛かりになるんですが....
まあ, 思い付くのは
・実は BL/FileIO.pm が存在しない
・$cmd_path に「コンパイル時に」値が設定されていない
くらいかなぁ.

この回答への補足

ちなみにperl5.8.7でも結果は同じでした。。

補足日時:2006/12/06 10:18
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

サンプルと実行結果を以下に書きます。
ちなみに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.
-----------------------------------------

お礼日時:2006/12/06 09:19

q や qw は変数を展開しないのでダメ.


qq なら展開するはずです. つまり, ($cmd_path に適切な値が入っているのであれば)
use lib qq($cmd_path);
でいいはず.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
use lib qq($cmd_path);
で早速試してみたのですが、
直前で$cmd_pathをプリントし、中身が入っているのに同じエラーになります。変数をダブルクォートで囲ってもダメでした。。
変数の中身入っているのに、なぜなのでしょうか。。

お礼日時:2006/12/05 20:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!