No.2ベストアンサー
- 回答日時:
まず Perl では「スクリプトの読み込み」→「解析」→「実行」の順に処理が行われる. そして, require は, その require 文が実行されるときに指定したスクリプトを読み込む. だから, この例だと b.pl は RequireFile の中の
require $_[0];
を実行したときに読み込まれる... というか, そうでないと b.pl が読み込めない.
次に RequireFile の中の
&SubXXX;
なり
SubXXX;
なりだけど, これは Perl の歴史的な事情で解釈が違う. つまり, 「&SubXXX;」は「サブルーチン SubXXX を呼び出す」という意味であるのに対し, 「SubXXX;」は「解析の時点でサブルーチン SubXXX が定義されていればそれを呼び出す」という意味になる (定義されていないときには「bareword」として「単なる文字列」の扱いになる). 余談だけど, サブルーチンのリファレンスを作るときに \&subroutine のように書くのは「サブルーチンを呼び出すときに必ず & を付けていた」時代の名残りでもある.
ということで, &SubXXX; になっている場合は「実行がそこに到達する」までにサブルーチン SubXXX が (b.pl を読み込むことによって定義されるので) 期待通りに実行される. 一方で SubXXX; だと「解析をする = a.pl を読み込んだ」時点ではそのようなサブルーチンを知らないので, 「サブルーチン SubXXX の呼び出し」とは解釈されずその結果として print も実行されない, ということになる.
なお「じゃあ main.pl の RequireFile('./b.pl'); はどうなんだ」ということになる (解析の時点では RequireFile というサブルーチンを知らない) が, これは「かっこがあるのでサブルーチン呼び出しである」と解釈されたんだと思う.
この回答へのお礼
お礼日時:2022/10/31 21:58
回答ありがとうございます
難しいですけどとてもわかりやすく理解できました
kansha;
sub kansha{
print "ありがとうございます¥n";
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- CGI CGIで出力するhtmlの<!DOCTYPE html>等のタグは要りますか? 2 2023/02/05 21:26
- CGI 「CGIにより定義されていない」とは・・・ ? 3 2023/01/01 12:00
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- CGI htmlからcgiを自動的に起動させたい 1 2023/02/21 19:39
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- その他(ブログ) ランキングサイトのポイントが発生しない理由 1 2023/01/21 11:40
- 照明・ライト 100V照明の交換、調光器について 4 2023/06/15 15:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jcode.plが読み込めない
-
webからroot権限のコマンドを実...
-
useとrequireでエラー
-
require文が実行できない
-
同一ファイルでほかのページを作成
-
月の第一週とは
-
エクセルで毎月第2週日の水曜日...
-
エクセルで相対パスの書き方を...
-
よくある 『 第○(1・2・3・4・...
-
クライアントのIPとマシン名を...
-
週2回のペースって だいたい何...
-
apacheでPerl CGIが作動せず、5...
-
DBを10件毎に表示ページング...
-
時間によって変わるページについて
-
毎週同じ曜日にラブホに行くと...
-
CGIの中で出力するテキスト内容...
-
Excel関数で当月の第一日曜日の...
-
都心環状線のルーレット族は何...
-
毎○曜日って、使いますか?
-
土曜日の26時って何曜日の何時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cgiとplとpm
-
jcode.plが読み込めない
-
セッションファイルが作成でき...
-
webからroot権限のコマンドを実...
-
バイナリファイルのアップロード
-
htmlからテキストを返すperlを...
-
画像のアップロード機能
-
クッキーについて
-
プログラムを書き足すことについて
-
IMGタグにaaa.cgiを指定して、...
-
Quantifier follows nothing in...
-
ファイル書込時にPermission de...
-
ブラウザでタグがはみ出る
-
PDFJが動作しない
-
アンケートフォームの作成
-
自CGIのURLのパス部分を取得す...
-
リンクをクリックした時に別ペ...
-
Perlでuse strictと %inの共存
-
ログイン成功の後は?
-
apacheのCGI設定について教えて...
おすすめ情報
main.pl:
require './a.pl';
RequireFile('./b.pl');
a.pl:
sub RequireFile {
require $_[0];
&SubXXX;
}
1;
b.pl:
sub SubXXX {
print "sub SubXXX at b.pl\n";
}
1;
これでうまくprint文が実行されました。しかしa.plの&SubXXXの&を取り除いてSubXXXを呼び出すとprint文は実行されませんでした。わかりませんでした。なぜなのか。
require文というのはC言語の#include文のように実行前に展開されるのではなく、1行ずつ実行しながら展開しているのでしょうか?
そのあたりの実行の仕組みを知りたいです。