- 締切済み
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 も含めてこの様な使い方は 間違っていませんでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
> ファイルに設定値を保存しておいて再利用する場合は、ごく普通に > 開いて、読んで、閉じてといった手順を踏むのが当たり前ということでしょうか。 最近の流行だと 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
- W_H
- ベストアンサー率47% (21/44)
ぼくの場合、確か最後の行の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を入れた方がいいと思います。
お礼
こんにちは、W_H さん、ありがとうございます。 >(ファイルに配列を書き、それをrepuireで読み込むのは成功する。) ですね、なんかうまく意図した通りに動いちゃったのですが、 >でも、一応小分けプログラムということで、最後に1を入れた方がいいと思います。 設定値を格納したハッシュを Data::Dumper とかでファイルに吐き出して、 それを require するだけで再利用できたら楽かな?と思った次第ですが、ご指摘通り止めときます。 丁寧なご回答ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
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 も含めてこの様な使い方は > 間違っていませんでしょうか? 間違いということはないでしょうが、同様の結果を得る手段 としてはあまり使われないパターンだと思います。
お礼
こんにちは、sakusaker7 さん。 以前もお世話になっていまして、今回もありがとうございます。 実行時に複数の設定値を使い分ける場合に、 ハッシュのリファレンスとかを返したら、 ファイルのopen closeがない分ちょっと楽で便利かな? と思ってやってみたら、動いちゃったと言う感じで。 おっしゃる通りあまり見かけないなと思い質問しました。 >同様の結果を得る手段 >としてはあまり使われないパターンだと思います。 やらない方が良いと言う意味で受け取って、やめときます。 ファイルに設定値を保存しておいて再利用する場合は、ごく普通に 開いて、読んで、閉じてといった手順を踏むのが当たり前ということでしょうか。
- isle
- ベストアンサー率51% (77/150)
0(falseの意)を返すと異常終了するんじゃなかったっけ?
お礼
はい、たしかそうだと思います。 ただ、eval してるせいか、仮に最終行に0を書いても異常終了はしませんでした。
補足
すみません。タイプミス連発してましたので、修正させてください。 -- 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]}; } おっちょこちょいぶりを露呈してしまってお恥ずかしい限りです。 もう間違ってないと思いますが…。
お礼
度々ありがとうございます。 まだ使ったことないんですが、 YAML とか JSON 辺りをみてみようかなと思います。 もし次があったら、またよろしくお願いします。