• 締切済み

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 はベタ書きしかないのでしょうか?

  • Perl
  • 回答数4
  • ありがとう数7

みんなの回答

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.4

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

参考URL:
http://www.rfs.jp/sb/perl/05/01.html
genu123
質問者

お礼

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

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.3

そのようになる原因は、No.2さんの仰ったとおり ・$cmd_path に「コンパイル時に」値が設定されていない ということです。 useは他のプログラムよりも先駆けて実行されます。 つまり、$cmd_nameに値を入れるプログラム部分よりも先に実行されるので、use libする時の$cmd_nameの中身は空です。 これを解決するには、$cmd_nameに値を入れる処理部分を BEGIN{ : : } で囲みましょう。 BEGINで囲んだ処理がuseよりも上にあれば、useの実行前にBEGINの処理が行われます。

genu123
質問者

お礼

bgbgさん、Tacosanさん本当にありがとうございます。 解決しました。 おっしゃるとおりBEGINで囲みましたら問題なく動きました。 本当にありがとうございました。 追加で質問なのですが、 use lib qq( $cmd_path ); use lib qw( $cmd_path ); どちらでもエラーにはならないのですが、どちらを使用しても問題ないでしょうか? 何度も質問して申し訳ありませんがよろしくお願いいたします。

genu123
質問者

補足

すみません。 やはりTacosanのおっしゃるとおり、use lib qw( $cmd_path );でないとだめなようです。 BEGIN{ の中でunshift(@INC, $cmd_path);を設定していた為です。。 bgbgさん、Tacosanさん、全て解決しましたので、深くお礼申し上げます。<(_ _)>

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

genu123
質問者

お礼

ご回答ありがとうございます。 サンプルと実行結果を以下に書きます。 ちなみに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. -----------------------------------------

genu123
質問者

補足

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

q や qw は変数を展開しないのでダメ. qq なら展開するはずです. つまり, ($cmd_path に適切な値が入っているのであれば) use lib qq($cmd_path); でいいはず.

genu123
質問者

お礼

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

関連するQ&A

  • use Util;を使いたいのですが・・・

    初歩的な質問で失礼いたします。 CentOSのサーバーでcgiでプログラムを作成しているのですが、 「use Util;」を宣言時にエラーが発生してしまいます。 【エラー内容】 Can't locate Util.pm in @INC (@INC contains: ./lib /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi yumやcpanのコマンドでUtilモジュールをサーバーに入れればよいのですが、 「use Util;」はどのモジュールになるのかがわからず困っております。 試しに、yum list コマンドで Util が付いているパッケージを探し、yum install してみましたが解決されませんでした。 (yum -y install perl-Util-SelfDestruct.noarch など) ご存じな方がおられましたら、ご教示お願いします。 宜しくお願い致します。

  • パスがうまく通らない

    Check.pmが  o:\public_html/post_pervice/cgi/lib にあります。 このモジュールを利用するために以下のようなプログラムを書きました。   #! /usr/bin/perl -w   use CGI::Carp qw(fatalsToBrowser);   unshift @INC, "o:/public_html/post_service/cgi/lib";   print join "\n",@INC;   use Check; この中の  use Check; をコメントで伏せて動かすと、   o:/public_html/post_service/cgi/lib   O:/usr/site/lib   O:/usr/lib のような表示がなされるので、  unshift @INC, "o:/public_html/post_service/cgi/lib"; はちゃんと機能しているようです。 しかし  use Check; のコメントを外して動かすと、   Can't locate Check.pm in @INC (@INC contains: O:/usr/site/lib O:/usr/lib .) at O:\public_html\post_service\cgi\showINC.pl line 8.   BEGIN failed--compilation aborted at O:\public_html\post_service\cgi\showINC.pl line 8. のようなエラーが出てしまいます。 何がいけないのでしょう。

    • ベストアンサー
    • Perl
  • perl niftyについて。use CGI;

    画像アップロードのスクリプトを作ろうと思っているのですが、 use CGI; という記述をすると、ここでエラーに引っかかります。 下はperl checkerでのエラー表示です Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5/5.00503/sun4-solaris /usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/site_perl/5.005/sun4-solaris /usr/local/lib/perl5/site_perl/5.005 .) at a.cgi line 10. BEGIN failed--compilation aborted at a.cgi line 10. 参考URLはここ http://www.topstudio.co.jp/~kmuto/html/node38.html niftyでは使えないようになってしまっているのでしょうか? また、CGI.pmを使わないファイルアップロードの仕組みを解説しているサイトを知っている方がいたら、教えてくださいませ。

    • ベストアンサー
    • CGI
  • Perlでモジュールを作りましたが、

    use A::AA; 自作のA::AAのPerlモジュールをインストールしましたが、いざ使うときに Can't locate A/AA.pm in @INC (@INC contains: ... とエラーが発生しました。 A/AA.pmの存在の確認はとれましたが、何か関連付けさせる仕組みが必要なのでしょうか? C:\usr\site\lib\aに aa.pmが入っています。

    • ベストアンサー
    • Perl
  • エラーでハマっている為、use AutoLoaderする際の記述法と概

    エラーでハマっている為、use AutoLoaderする際の記述法と概念を知りたいです。 ----------------------------------------------- test.cgi use lib '/var/www/lib'; unshift @INC, '/var/www/lib'; use AutoLoader 'AUTOLOAD'; RegistDataList();#ここで存在しない関数を呼び出す ----------------------------------------------- ●自作モジュール(UserEditCommon.pm) ----------------------------------------------- package UserEditCommon; BEGIN{ use Exporter(); @ISA = qw(Exporter); @EXPORT_OK = qw(RegistDataList); } use utf8; use open ":utf8"; use open ":std"; use AutoLoader 'AUTOLOAD'; 1; __END__ ここ以降に色々な関数が記述されていますが、元々ライブラリーだった為、OOP的なコンストラクタやデストラクタは記述していません。 ---------------------------------------------- $ perl -e 'use AutoSplit; autosplit($ARGV[0], $ARGV[1], 0, , 1)' UserEditCommon.pm auto 上記を実行すると、auto/UserEditCommon/関数名.alファイルが沢山出来ました。 それを/var/www/lib/autoとしてUP ●下記を参考にしているのですが http://perldoc.jp/docs/perl/5.8.0/AutoLoader.pod.pod 抜粋「B<AutoLoader>のAUTOLOADサブルーチンために、 明示的にそれをインポートI<しなければなりません>。」 とある為、 use AutoLoader 'AUTOLOAD'; と記述する際はtest.cgi内ではsub AUTOLOADが必要ないと解釈しています。 実行した際、 Can't locate auto/main/RegistDataL.al in @INC (@INC contains: /var/www/lib ... となり、auto/main/のRegistDataList.alが呼ばれているはずなのに、なぜRegistDataL.alという名前でのエラーなのでしょうか ●またtest.cgi内で use AutoLoader; とした場合のsub AUTOLOAD内の記述をお教え願えませんでしょうか sub AUTOLOAD { #print "$AUTOLOAD は未定義です"; my $sub = $AUTOLOAD; $sub =~ s/.*:://; $AutoLoader::AUTOLOAD = $sub; goto &AutoLoader::AUTOLOAD; } 上記のようにしても、エラー内容が Can't locate auto/AutoLoader/RegistDataL.al in @INC (@INC contains: /var/... となってしまい、どうすればよいか途方にくれています。

    • ベストアンサー
    • Perl
  • CGIからuse GDBM_Fileを宣言出来ない

    質問失礼します。 GDBMを用いたプログラムをperlで作ったのですが、 solarisのコマンドラインから打ち込むと普通に実行出来ます。 しかし、webブラウザからCGIでsystem関数を使い そのプログラムを呼び出すと実行出来ません。 どうやら use GDBM_File; の部分でエラーが起きているようです。 そこで、エラーログを見ると以下の記述がありました [Wed Jan 23 17:17:13 2008] [error] [client 157.80.85.160] Can't locate GDBM_file.pm in @INC (@INC contains: /usr/perl5/5.8.4/lib/sun4-solaris-64int /usr/perl5/5.8.4/lib /usr/perl5/site_perl/5.8.4/sun4-solaris-64int /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl /usr/perl5/vendor_perl/5.8.4/sun4-solaris-64int /usr/perl5/vendor_perl/5.8.4 /usr/perl5/vendor_perl .)~以下略 とにかく「Can't locate GDBM_file.pm ~」と書いてあるので 以下の文を「use GDBM_File;」の上に加えて、 探す場所を指定したのですが use lib '/opt/csw/lib/perl/5.8.8'; 今度は [Wed Jan 23 20:15:05 2008] [error] [client 157.80.85.160] Can't load '/opt/csw/lib/perl/5.8.8/auto/GDBM_File/GDBM_File.so' for module GDBM_File: ld.so.1: perl: fatal: relocation error: file /opt/csw/lib/perl/5.8.8/auto/GDBM_File/GDBM_File.so: symbol Perl_croak_nocontext: referenced symbol not found at /usr/perl5/5.8.4/lib/sun4-solaris-64int/XSLoader.pm line 68., ~以下略 と出てきて、実行されません パーミッションも「444」で読み込みは出来るようになっているはずです どなたかこのエラーの解決法がわかる方はいませんでしょうか? ご教授願います。

    • 締切済み
    • CGI
  • SOAP::Liteを利用したい!

    Linux上でPerlを用いて use SOAP::Lite .... というプログラムを書いたのですが、 これを実行させると Can't locate SOAP/Lite.pm in @INC(@INC contains : /usr/local/lib/perl5/5.8.5/i686-linux.... SOAP/Lite.pmが含まれていないというエラーメッセージが表示されます。 現在使っているPerlのバージョンが5.8.5であり、SOAP/Lite.pmがないみたいです。 このコンピュータには5.005のバージョンがあり、ここには、 SOAP/Lite.pmが /usr/lib/perl5/site-perl/5.005/Apache/ /usr/lib/perl5/site-perl/5.005/XMLRPC/ の下にあります。 5.8.5のバージョンで、設定を変えてこれを利用したいと思っているのですが、設定の変え方がわかりません。どのような方法がありますか?教えてください。

    • ベストアンサー
    • Perl
  • perlのモジュールについて

    Linuxを使って間もない者です.xamppをLinuxにインストールしたのですが、モジュールの格納場所が違っているせいかうまくCGIスクリプトがうまく実行できません. Linux上でのperlモジュールの格納場所を教えていただけないでしょうか? 以下エラー内容 Can't locate JSON/PP.pm in @INC (@INC contains: /usr/lib/perl5/5.8.6/i386-linux-thread-multi /usr/lib/perl5/5.8.6 /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi 省略・・ /usr/lib/perl5/vendor_perl/5.8.6 //usr/local/lib/site_perl/5.8.2/i386-linux-thread-multi /usr/local/lib/site_perl/5.8.2 /usr/local/lib/site_perl .) at (eval 4) line 3.

  • CygwinでPerlのCSV_XSを実行する

    Cygwin TerminalをWin7x64にインストールしました。 インストール完了後、Perlプログラムでuse Text::CSV_XSを実行すると Can't locate Text/CSV_XS.pm in @INC エラーが出てしまいます。 ・エラー Can't locate Text/CSV_XS.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.14/i686-cygwin-threads-64int /usr/lib/perl5/site_perl/5.14 /usr/lib/perl5/vendor_perl/5.14/i686-cygwin-threads-64int /usr/lib/perl5/vendor_perl/5.14 /usr/lib/perl5/5.14/i686-cygwin-threads-64int /usr/lib/perl5/5.14 /usr/lib/perl5/site_perl/5.10 /usr/lib/perl5/vendor_perl/5.10 /usr/lib/perl5/site_perl/5.8 .) at mysql.pl line 11. ・やってみたこと perl -MCPAN -e shell install Text::CSV_XS を実行してみたのですがダメでした。 どのように対応すれば解決できますでしょうか? ご教授お願いします。

    • ベストアンサー
    • Perl
  • CGIでの環境変数PERL5LIBの設定

    自分の ~/.bash_profile で、 export PERL5LIB=/usr/local/lib というように設定しているのですが、 CGIではこれが反映されていません。 どこでPERL5LIBを設定すれば、 /usr/local/lib が @INCに組み込まれるようになるのでしょうか?

    • ベストアンサー
    • CGI

専門家に質問してみよう