• 締切済み

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 も含めてこの様な使い方は 間違っていませんでしょうか? よろしくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

> ファイルに設定値を保存しておいて再利用する場合は、ごく普通に > 開いて、読んで、閉じてといった手順を踏むのが当たり前ということでしょうか。 最近の流行だと YAML を使うとか。 あるいはモジュールがいくつかありますのでそれを使うという手も。 Thomas Linden / Config-General - search.cpan.org http://search.cpan.org/dist/Config-General/ Config::Simple - 簡単な設定ファイルクラス http://perldoc.jp/docs/modules/Config-Simple-4.55/Simple.pod

g_p_
質問者

お礼

度々ありがとうございます。 まだ使ったことないんですが、 YAML とか JSON 辺りをみてみようかなと思います。 もし次があったら、またよろしくお願いします。

  • W_H
  • ベストアンサー率47% (21/44)
回答No.3

ぼくの場合、確か最後の行の1は、これがエラープログラムではない事の証明だったと思います。 プログラムは何かを実行し、成功すると、1を返します。 $a=print"a\n"; print $a,"\n"; を実行してみてください。結果は a 1 となります。print文が実行され、成功した値が$aに入っています。 で、この1を一つも返さないプログラムは、エラーばかりと言う事になるので、一つでも1を返す処理がなければ、requireで呼び出すファイルは不正なものと判定されるみたいです。(昔、自作ライブラリの最後の1がなくてCGIが動かなかった記憶が。) ちなみに、自作関数や中身は1を返すプログラムとは判定されないので、これだけだとだめなようです。(プログラムを箱、自作関数を小さな箱とするなら、小さな箱は開かない限り何が入っているか分からない。呼び出して箱は開いても、小さな箱まで一斉に呼び出すわけではないので開かない。) なので、呼び出すファイルに$a=1;でもいいので、何か実行して1を返すようなものがあれば、別に最後の1はいらなかったはずです。(ファイルに配列を書き、それをrepuireで読み込むのは成功する。) でも、一応小分けプログラムということで、最後に1を入れた方がいいと思います。

g_p_
質問者

お礼

こんにちは、W_H さん、ありがとうございます。 >(ファイルに配列を書き、それをrepuireで読み込むのは成功する。) ですね、なんかうまく意図した通りに動いちゃったのですが、 >でも、一応小分けプログラムということで、最後に1を入れた方がいいと思います。 設定値を格納したハッシュを Data::Dumper とかでファイルに吐き出して、 それを require するだけで再利用できたら楽かな?と思った次第ですが、ご指摘通り止めときます。 丁寧なご回答ありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

requireによるファイルの取り込みがきちんとできたかどうかを 判定するのに、requireされたファイルの末尾の値を使います。 #1の方の回答のとおり、false(0)を返してしまうと requireは失敗したという判定になってしまいます。 では0/1以外はどうか、ですが The file must return true as the last statement to indicate successful execution of any initialization code, so it's customary to end such a file with "1;" unless you're sure it'll return true otherwise. But it's better just to put the "1;", in case you add more statements. requireが誤動作するようなことはありませんが、 1以外(0でもない)の値に何か意味をもたせるのでなければ、 1を返しておきましょうということです。 > 結果はうまく行ったのですが、eval も含めてこの様な使い方は > 間違っていませんでしょうか? 間違いということはないでしょうが、同様の結果を得る手段 としてはあまり使われないパターンだと思います。

g_p_
質問者

お礼

こんにちは、sakusaker7 さん。 以前もお世話になっていまして、今回もありがとうございます。 実行時に複数の設定値を使い分ける場合に、 ハッシュのリファレンスとかを返したら、 ファイルのopen closeがない分ちょっと楽で便利かな? と思ってやってみたら、動いちゃったと言う感じで。 おっしゃる通りあまり見かけないなと思い質問しました。 >同様の結果を得る手段 >としてはあまり使われないパターンだと思います。 やらない方が良いと言う意味で受け取って、やめときます。 ファイルに設定値を保存しておいて再利用する場合は、ごく普通に 開いて、読んで、閉じてといった手順を踏むのが当たり前ということでしょうか。

  • isle
  • ベストアンサー率51% (77/150)
回答No.1

0(falseの意)を返すと異常終了するんじゃなかったっけ?

g_p_
質問者

お礼

はい、たしかそうだと思います。 ただ、eval してるせいか、仮に最終行に0を書いても異常終了はしませんでした。

g_p_
質問者

補足

すみません。タイプミス連発してましたので、修正させてください。 -- require されるファイル array.pl -- #! usr/bin/perl -w use strict; ['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]}; } おっちょこちょいぶりを露呈してしまってお恥ずかしい限りです。 もう間違ってないと思いますが…。

関連するQ&A