電子書籍の厳選無料作品が豊富!

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

A 回答 (4件)

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

間違いということはないでしょうが、同様の結果を得る手段
としてはあまり使われないパターンだと思います。
    • good
    • 0
この回答へのお礼

こんにちは、sakusaker7 さん。
以前もお世話になっていまして、今回もありがとうございます。

実行時に複数の設定値を使い分ける場合に、
ハッシュのリファレンスとかを返したら、
ファイルのopen closeがない分ちょっと楽で便利かな?
と思ってやってみたら、動いちゃったと言う感じで。
おっしゃる通りあまり見かけないなと思い質問しました。

>同様の結果を得る手段
>としてはあまり使われないパターンだと思います。

やらない方が良いと言う意味で受け取って、やめときます。

ファイルに設定値を保存しておいて再利用する場合は、ごく普通に
開いて、読んで、閉じてといった手順を踏むのが当たり前ということでしょうか。

お礼日時:2007/05/29 19:25

> ファイルに設定値を保存しておいて再利用する場合は、ごく普通に


> 開いて、読んで、閉じてといった手順を踏むのが当たり前ということでしょうか。

最近の流行だと 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.5 …
    • good
    • 0
この回答へのお礼

度々ありがとうございます。

まだ使ったことないんですが、
YAML とか JSON 辺りをみてみようかなと思います。

もし次があったら、またよろしくお願いします。

お礼日時:2007/05/30 16:45

ぼくの場合、確か最後の行の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を入れた方がいいと思います。
    • good
    • 0
この回答へのお礼

こんにちは、W_H さん、ありがとうございます。
>(ファイルに配列を書き、それをrepuireで読み込むのは成功する。)

ですね、なんかうまく意図した通りに動いちゃったのですが、

>でも、一応小分けプログラムということで、最後に1を入れた方がいいと思います。

設定値を格納したハッシュを Data::Dumper とかでファイルに吐き出して、
それを require するだけで再利用できたら楽かな?と思った次第ですが、ご指摘通り止めときます。

丁寧なご回答ありがとうございました。

お礼日時:2007/05/30 06:48

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

この回答への補足

すみません。タイプミス連発してましたので、修正させてください。
-- 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]}; }

おっちょこちょいぶりを露呈してしまってお恥ずかしい限りです。
もう間違ってないと思いますが…。

補足日時:2007/05/29 18:09
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/29 18:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!