モジュールへのパスを設定するのに以下のようにすると
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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
蛇足ですが、
qq()は中の文字列をダブルクォートで括った場合と同じ意味、
qw()は中の文字列を半角スペースでsplitしたのと同じ効果(つまり配列が返る)です。
その用法は全く違います。
他にもqで始まる関数はいろいろあるので、この機会に勉強してみてください。
ちなみにuse libは配列の引数を必要とします。
参考URL:http://www.rfs.jp/sb/perl/05/01.html
bgbgさん、参考になるページまで教えていただきありがとうございます。
もう少し勉強してみたいと思います。
このたびは、色々と教えていただきありがとうございました。
No.3
- 回答日時:
そのようになる原因は、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 );
どちらでもエラーにはならないのですが、どちらを使用しても問題ないでしょうか?
何度も質問して申し訳ありませんがよろしくお願いいたします。
No.2
- 回答日時:
手元 (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.
-----------------------------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- サーバー WindowsでApache が起動しない 1 2022/11/29 12:21
- Windows 10 pathが通らない 2 2023/03/27 11:28
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/10/26 17:14
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- Windows 10 USBにwindows10をいれて起動する方法 5 2022/04/14 14:29
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SOAP::Liteを利用したい!
-
python 環境構築について
-
Expat.soが読めない!?
-
Excel VBAでリンク切れをチェッ...
-
例外処理のフローチャートの記...
-
ユーザー定義関数に#NAME?が返...
-
VBA This Workbookモジュール...
-
Cからシェルを起動し返り値をハ...
-
「デバイスは PRN を初期化でき...
-
エクセルVBAで標準モジュー...
-
ユーザーフォーム上に表示され...
-
VBでグローバル変数を宣言するには
-
Excel VBA 『Call』で呼び出す...
-
”:”がいっぱいの文について。
-
bashのgrepで複数の検索、かつ...
-
偶数/奇数の判定
-
Perlソースコードをコンパイル...
-
Access VBA標準モジュールにつ...
-
VBAで別モジュールへの変数の受...
-
fortran95実行エラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
use lib qw(変数名);は無理?
-
Python エクセル読み込み xlrd...
-
XML::Parser::Expat が無い?
-
Pg.pmモジュールがロードできない
-
perl DBD::Pg インストールでエ...
-
python
-
YAMLについて
-
Net::SSH::Perlについて
-
python 環境構築について
-
Pythonの設定方法(text_factory)
-
DB_Fileモジュールインストール...
-
perl MeCab 和布蕪 エラー
-
メールフォームからメール送信...
-
perlからpostgres連携時にエラ...
-
perlのモジュールについて
-
DBIをCPANからインストール時に...
-
Compress:Zlibコンパイルエラー
-
Perl+DBD::Oracleのエラーがわ...
-
SOAP::Liteを利用したい!
-
@INCにrequireされたファイルが...
おすすめ情報