No.1
- 回答日時:
「サブルーチンの定義」は「うまく」できるだろうけど....
RequireFile の
SubXXX;
のところで (設定によっては) 警告またはエラーが出るかもね.
まあ, 実際にやってみればいいんじゃないかな.
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ランキング
-
perlのcgiで、変数の中身を表示...
-
ファイル書込時にPermission de...
-
よくある 『 第○(1・2・3・4・...
-
月の第一週とは
-
週2回のペースって だいたい何...
-
6月の第2 第4火曜日は何日...
-
曜日のなぞ
-
今週とは何曜日から何曜日まで...
-
アンケートなどの1日1回の投...
-
HttpClientを利用してのサービ...
-
燃えるゴミの日は何曜日ですか?
-
apacheでPerl CGIが作動せず、5...
-
cgiから別のcgiへの変数...
-
CGIの結果をHTMLの一部に貼り付...
-
Pythonのstatsmodelsでカルマン...
-
エクセルで相対パスの書き方を...
-
VBA。複数のChangeイベントをま...
-
毎週同じ曜日にラブホに行くと...
-
関数ヘッダ?
-
日本語問題 昨日は何曜日ですか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cgiとplとpm
-
perlのrequireの動き方について...
-
jcode.plが読み込めない
-
Quantifier follows nothing in...
-
require文が実行できない
-
ファイル書込時にPermission de...
-
useとrequireでエラー
-
htmlからテキストを返すperlを...
-
Perlのデバッグ方法って。。。...
-
PDFJが動作しない
-
画像のURLの変数を別のCG...
-
perlのcgiで、変数の中身を表示...
-
perlをインストールしたのに使...
-
CGIの中にinclude
-
perl初心者です
-
プログラムを書き足すことについて
-
gifcat.pl:助言お願い致します
-
バイナリファイルのアップロード
-
phone.plというモジュールを使...
-
さくらレンタルサーバーのライ...
おすすめ情報
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行ずつ実行しながら展開しているのでしょうか?
そのあたりの実行の仕組みを知りたいです。