![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
こんにちは、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 も含めてこの様な使い方は
間違っていませんでしょうか?
よろしくお願いします。
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 も含めてこの様な使い方は
> 間違っていませんでしょうか?
間違いということはないでしょうが、同様の結果を得る手段
としてはあまり使われないパターンだと思います。
こんにちは、sakusaker7 さん。
以前もお世話になっていまして、今回もありがとうございます。
実行時に複数の設定値を使い分ける場合に、
ハッシュのリファレンスとかを返したら、
ファイルのopen closeがない分ちょっと楽で便利かな?
と思ってやってみたら、動いちゃったと言う感じで。
おっしゃる通りあまり見かけないなと思い質問しました。
>同様の結果を得る手段
>としてはあまり使われないパターンだと思います。
やらない方が良いと言う意味で受け取って、やめときます。
ファイルに設定値を保存しておいて再利用する場合は、ごく普通に
開いて、読んで、閉じてといった手順を踏むのが当たり前ということでしょうか。
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.5 …
度々ありがとうございます。
まだ使ったことないんですが、
YAML とか JSON 辺りをみてみようかなと思います。
もし次があったら、またよろしくお願いします。
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を入れた方がいいと思います。
こんにちは、W_H さん、ありがとうございます。
>(ファイルに配列を書き、それをrepuireで読み込むのは成功する。)
ですね、なんかうまく意図した通りに動いちゃったのですが、
>でも、一応小分けプログラムということで、最後に1を入れた方がいいと思います。
設定値を格納したハッシュを Data::Dumper とかでファイルに吐き出して、
それを require するだけで再利用できたら楽かな?と思った次第ですが、ご指摘通り止めときます。
丁寧なご回答ありがとうございました。
No.1
- 回答日時:
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]}; }
おっちょこちょいぶりを露呈してしまってお恥ずかしい限りです。
もう間違ってないと思いますが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/02/07 09:58
- Excel(エクセル) ワードのマクロについて教えてください。 1 2023/03/11 13:50
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jcode.plが読み込めない
-
perlのrequireの動き方について...
-
requireについて教えてください。
-
Perlのインストールについて
-
QUERY_STRING が、SSIを使用す...
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
6月の第2 第4火曜日は何日...
-
今週とは何曜日から何曜日まで...
-
FORMのFILEでフォルダ(ディレ...
-
[Excel] ある日の曜日が当月の"...
-
エクセルで毎月第2週日の水曜日...
-
日本語問題 昨日は何曜日ですか...
-
Webで取得できる情報
-
週2回のペースって だいたい何...
-
c言語の質問です。 ある月のカ...
-
第○曜日であるかを取得する関数
-
apacheで403を404のように見せる
-
土曜日の26時って何曜日の何時...
-
C言語でわからないところがが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cgiとplとpm
-
jcode.plが読み込めない
-
セッションファイルが作成でき...
-
webからroot権限のコマンドを実...
-
バイナリファイルのアップロード
-
htmlからテキストを返すperlを...
-
画像のアップロード機能
-
プログラムを書き足すことについて
-
クッキーについて
-
Quantifier follows nothing in...
-
IMGタグにaaa.cgiを指定して、...
-
ブラウザでタグがはみ出る
-
アンケートフォームの作成
-
PDFJが動作しない
-
ファイル書込時にPermission de...
-
自CGIのURLのパス部分を取得す...
-
リンクをクリックした時に別ペ...
-
Perlでuse strictと %inの共存
-
ログイン成功の後は?
-
apacheのCGI設定について教えて...
おすすめ情報