ppでのrequire代替方法とは?

このQ&Aのポイント
  • ActivePerl v5.8.7を使用している場合、pp(Perl Packager)を使用してオリジナルのスクリプトをexe形式に変換することができますが、他のPCで実行する際にrequire先のファイルが見つからないというエラーが発生します。
  • 一時凌ぎとして、requireの代わりにモジュールファイルの内容をペーストする方法がありますが、これは正しい解決策ではありません。
  • ppで完全にパッケージ化するか、モジュールをインストールすることで他のPCでも正常に実行できるようにすることができます。
回答を見る
  • ベストアンサー

pp (Perl Packager) で requireの代わりになるもの

ActivePerl v5.8.7 をWin-2000で使っています。 オリジナルのスクリプト内で、これもオリジナルのモジュールをrequireしている場合に、 ppでexe形式に変換できるのですが、他のPCでコピーして使おうとしたときに、 ”require先のファイルが無い”とエラーになってしまいます。 これを回避する方法はないでしょうか? (requireの代わりに、該当箇所にモジュールファイルの内容すべてをペーストしてしまう、ということで一時凌ぎはできるのですが、何か違うような気がしています) よろしくお願いいたします。 ------------------------ #!perl require "c:\\perl\\sub\\userfunc.pm"; : : ------------------------ pp -o sample.exe sample.pl c:\perl\sub\userfunc.pm とやって、exeを作っています。 (c:\perl\sub\userfunc.pmを持たないPCで)実行すると、 C:\>sample.exe Can't locate c:\perl\sub\userfunc.pm in @INC (@INC contains: ・・・/inc CODE(0xdca6ac) . CODE( 0xdca7cc)) at script/sample.pl line 2.

  • supob
  • お礼率81% (49/60)
  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

userfunc.pmをsample.plと同じフォルダに入れて pp -o sample.exe sample.pl userfunc.pm としたらどうですか? こちらで試したところではパスを\ではなく / で指定すれば大丈夫のようでしたが、、、 i:\home\tarou\pblic_html\test.pl i:\home\jcode.pl  の場合に test.pl中にrequire "i:/home/jcode.pl"; と記述して pp -o test.exe testpl i:\home\jcode.pl だと実行時にエラー pp -o test.exe testpl i:/home/jcode.pl だと実行可能 でした。

参考URL:
http://www.perldoc.jp/docs/modules/PAR-0.75/script/pp.pod
supob
質問者

お礼

お返事が遅くなり、大変申し訳ありません。 ご回答ありがとうございました。 教えて頂いた方法を参考に、次のようにしました。 (1)スクリプト内では、require "userfunc.pm";のようにパス名なしのファイル名を記述。 (2)ppコンパイル時に、 /I オプションを付けて、c:\\perl\\sub のパスを明示。 こうすることで、exeの中にモジュールファイルも組み込まれるようで、 他のPerlを入れていないPCへ持っていっても使うことができるようになりました。 以上、遅くなりましたが、お礼まで。

supob
質問者

補足

Makefileで汎用的に書いてみました。私自身用にもメモ。 # Makefile for Perl Package SRC = \ sample.pl \ INC = \ c:\perl\sub \ TARGET = $(SRC:.pl=.exe) # PL (*.pl) PP = pp ### rules ### all: $(TARGET) .SUFFIXES: .pl .exe .pl.exe: $(PP) $< -I $(INC) -o $@

関連するQ&A

  • モジュールに定義した関数の実行

    sample.pmに定義したhello関数をmain.plから呼び出したいと思っています。(sample.pmとmain.plは同じディレクトリに存在)下記のように書いてみたのですが実行したところ以下のようなエラーが出てしまいました。これはどういう対応をすればよろしいのでしょうか? Can't locate sample.pm in @INC (you may need to install the sample module) (@INC contains: C:/Strawberry/perl/site/lib C:/Strawberry/perl/vendor/lib C:/Strawberry/perl/lib) at c:\Perl_prj\main.pl line 2. (main.pl) require 'sample.pm'; hello(); (sample.pm) sub hello { print 'hello'; } 1;

  • requireについて教えてください。

    こんにちは、require について教えてください。 require されるファイルの最終行は 1 を書くのが一般的ですが、 他の値を書くと何か問題があるのでしょうか? 以下の実験をしてみました。 -- require されるファイル array.pl -- #! usr/bin/perl -w use strinct; ['a','b','c',] -- 実行するスクリプト -- #! /usr/bin/perl use strict; my $array_ref = get_array_ref('array.pl'); print "$_n" foreach ( @{$array_ref} ); exit(); sub get_array_ref {   return eval {require $_[0]}; } -- 結果 -- a b c 結果はうまく行ったのですが、eval も含めてこの様な使い方は 間違っていませんでしょうか? よろしくお願いします。

  • Perlのモジュールについて

    perlで自作モジュールを作成したいのですが、どのように作成したらよいのでしょうか? 単にPackegae [モジュール名]; sub test{ ... } で Test.pmとすれば、モジュールとして使えますか? カレントディレクトリにrequire 'Test.pm'; とするとエラーになります。 あと、Perlだけで書いたモジュールとXS?で記述したモジュールは 基本的に同じものでしょうか?

    • ベストアンサー
    • Perl
  • requireの使い方のどこがおかしいのでしょう?

    言語はperlです。 789.cgiから456.plを呼び出したいのですが、シンタックスエラーが出てきます。 789.cgiのrequireに関する行をコメントにしたら実行されるのですが…。 requireを使わずに、サブルーチン自体を789.cgiの中に書き込むことには成功しているのですが、 イマイチrequireを使った呼び出しのコツがわかりません。 どなたかご教授下さい。 以下にスクリプトを示しておきます。 よろしくお願いします。 *****以下789.cgi***** #!/usr/local/bin/perl use CGI::Carp qw(fatalsToBrowser); require "456.pl"; $a=12; $b=15; $d="xxxxxxxx"; $d=&plus(); print "content-type:text/html\n\n"; print <<"HTML_HTML"; <html> <head> <title> ヒアドキュメント </title> <body> ***** <br> $d <br> ***** <br> $a <br> ***** <br> $b <br> ***** </body> </html> HTML_HTML ***********以下456.pl************ sub plus { my $a=10; my $b=10; $c=$a+$b; return $c; }

    • ベストアンサー
    • CGI
  • pp (Perl Packager) 実行時のCan't find par loader

    Windows-XP + ActivePerl v5.8.8 の環境です。 PARを見よう見まねでインストールしてから、ppを実行しようとすると、 -------------------------- D:\Develop\Perl>pp ppp.pl Can't find par loader at C:/Perl/site/lib/PAR/Packer.pm line 101. -------------------------- のようなエラーが出ます。 インストール方法等、何か抜けたものがあるでしょうか。 対処方法等、ご存知の方、よろしくお願いいたします。 ppp.pl内は次のような単純な内容です。 D:\Develop\Perl>type ppp.pl #!perl print "Hello, world!n"; ------------------------------ C:/Perl/site/lib/PAR/Packer.pm のline 101行目は次のような内容★でした。 sub set_options { : $self->{parl} ||= $self->_can_run("parl$Config{_exe}") or die("Can't find par loader"); ←★ : ----------------------------------------- <↓ppが使えるようになると思って、やった手順> 1)ActivePerlは、サイト(http://www.activestate.com/store/activeperl/download)から直接インストール。 2)PARをCPAN(http://search.cpan.org/dist/PAR/lib/PAR.pm)からDLしたtar.gzファイルを使ってインストール 2-1)PAR-0.956.tar.gz をtar解凍 2-2)C:\Perl\dl\PAR-0.956>perl Makefile.PL 実行でMakefile作成 2-3)できたMakefileを使って、C:\Perl\dl\PAR-0.956>nmake 実行 2-4)続いて、C:\Perl\dl\PAR-0.956>nmake install 実行 2-5)C:\Perl\bin 内に、pp.batが出来たことを確認 以上です。よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl2exeでuse encodingが使えない

    下記のようなスクリプトを作成しました。 スクリプト名は test_kanji.pl ---------------- use encoding("shift-jis"); print "表現\n"; ----------------- 上記を実行すると、正しく”表現”の文字が表示されます。 これをperl2exeで実行形式に変換すると 下記のエラーが表示され、期待した結果が得られません。 Converting 'test_kanji.pl' to test_kanji.exe Warning: Can't locate I18N/Langinfo.pm at C:\Perl\lib\encoding.pm line 41 @INC = c:\perl\userlib, C:\Perl\lib, C:\Perl\site\lib, . 又、強引にtest_kanji.exeを実行すると encoding: Unknown encoding 'shift-jis' at C:\Perl\userlib\test_kanji.exe line 1 BEGIN failed--compilation aborted at C:\Perl\userlib\test_kanji.exe line 1. のようなメッセージが表示され、”表現”が表示されません。 perl2exeでuse encodingは使用できないのでしょうか。

  • packageの中からのrequireがうまくいかない

    .pmファイルの中でrequireして別の.plファイルの中の関数を呼びたいのですがうまくいきません。 下記の例でmain.plを実行すると Undefined subroutine &module1::module2::hyoji のようになってしまいます。 どのようにしたら動くでしょうか --main.pl-- use module1; testprint(); --module1.pm-- package module1; sub testprint{   require "module2.pl"   hyoji(); #エラー    module2::hyoji(); # エラー   module1::module2::hyoji(); #エラー }1; module2.pl package module2; sub hyoji{   print "ZZZ"; }1; --main2.pl-- ちなみにこれは動きます require "module2.pl"; module2::hyoji();

    • ベストアンサー
    • Perl
  • Perlのモジュール呼び出しについて

    Perlのモジュール呼び出しについて質問があります。 windows2000/apache/perlの組合わせにより LOCALでWebサーバを構築しています。 かなり初心者質問で申し訳ありませんが、以下の内容で困っています。 Web上で use XXX と書いたperlを呼び出すと Can't locate XXX.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at (プログラムの場所) となって動作しません。 XXX.pmはC:/Perl/libにあることは確認しました。 ただしDOS上で同じplファイルを起動させると 問題なく動作しました。 何処に問題があると考えられますか? みなさまのお知恵をお貸し下さい。 よろしくお願いします。

  • perl でrequireされたファイル自身のフルファイル名を取得する

    perl でrequireされたファイル自身のフルファイル名を取得する方法を教えてください __FILE__ だとパス情報がありません。 また 起動したスクリプトではないので $ENV["SCRIPT_FILENAME"] , $0 では、取得できません。 どこに格納されているのでしょうか? %INCでは、無理ですし、@INCを使う方法では、信憑性にかけます requireするときにパスをグローバル変数に代入せずに どうしてもrequireされたファイル自身で 確実に正確な同じフォルダ名を取得する必要があるのでお願いします。 (※phpでは、__FILE__でフルパスで返ってくるので私の探し方が悪いだけだと思っています) perlでの取得方法の情報を お手数ですがよろしくお願いします

    • ベストアンサー
    • Perl
  • strict と require と グローバル変数

    また基本的なことをお伺いします。 ↓メインスクリプト(main.pl) ------------------------------ #!perl use strict; require("x.pl"); print "X = $x\n"; ------------------------------ ↓サブスクリプト(x.pl) ---------------------- our $x = "XXX"; ---------------------- これをそのまま、main.plを実行すると、 Global symbol "$x" requires explicit package name at main.pl line 4. のようにエラーが出ます。 この対処として、色々試したのですが、 例えば、次のようにすれば、とりあえず回避はできました。 ↓メインスクリプトにて、 ------------------------------ #!perl use strict; our $x; ←★ここで宣言を入れておく。 require("x.pl"); print "X = $x\n"; ------------------------------ <質問です> 1)この回避策は妥当でしょうか。他に正しい方法がありましたら、教えてください。 2)そもそも、use strictは、requireの展開よりも先に実行されてしまうものでしょうか。 以上、よろしくお願いします。 Win-2000sp4+ActivePerlのV5.8.7で使っています。

    • ベストアンサー
    • Perl

専門家に質問してみよう