File::Find
と wanted
サブルーチン
この質問は、元のタイトル (「プロトタイプとサブルーチンの前方宣言」!) よりもはるかに単純です。答えが単純であっても、サブルーチン/関数、プロトタイプ、スコープ、およびFile::Find
モジュールを理解するのに役立つことを願っています。
Perl では、サブルーチンはほとんどどこにでも表示でき、通常は前方宣言を行う必要はありません (ただし、サブルーチンがプロトタイプを宣言する場合を除きます。これは、Perl で「標準的な」方法で行う方法がわかりません)。私が通常Perlで行うことについては、これらの異なる実行方法の間にほとんど違いはありませんsomefunction
:
sub somefunction; # Forward declares the function
&somefunction;
somefunction();
somefunction; # Bare word warning under `strict subs`
find2perl
私は、スクリプトの一部にクリブ/ハックするコードを生成するためによく使用します。これは悪いスタイルである可能性があり、私の汚れた洗濯物は公開されていますが、そうです:-)関数は必須のサブルーチンであるためFile::Find
、それを作成し、作成した結果のスクリプトに追加します。時々、スクリプトを編集するときに " " を削除すると、orになります。しかし、前方宣言フォームがないと、次の警告が表示されます。wanted
find2perl
sub wanted;
sub
sub wanted
&wanted;
wanted();
sub wanted;
Use of uninitialized value $_ in lstat at findscript.pl line 29
私の質問は次のとおりです。なぜこれが起こり、それは本当の問題なのですか? 「単なる警告」ですが、もっとよく理解したいです。
- ドキュメントとコード
$_
は、 内でローカライズされていsub wanted {}
ます。wanted();
の代わりに使用すると、なぜ未定義になるのでしょうsub wanted;
か? - どこ
wanted
かでプロトタイプを使用していますか? で明らかな何かが欠けていFind/File.pm
ますか? wanted
コード参照を返すからですか?(???)
私の推測ではwanted
、最初の使用で空のデフォルト変数がないように、前方宣言フォームが何らかの方法で「初期化」されると思います。これは、プロトタイプ (存在するような Perl プロトタイプでさえ) も同様に機能する方法だと思います。の代わりに をsub
使用して関数が呼び出されたときに何が行われているかを把握するために、Perl のソース コードを調べてみましたが、この時点では理解できないかもしれません。sub function
function()
これについての私の理解を深める(そしてスピードアップする)助けがあれば、大歓迎です。
編集:の出力を使用して作成した Stack Overflowの最近のサンプル スクリプトを次に示します。find2perl
を削除するsub
とsub wanted;
、同じエラーが発生するはずです。
編集:以下のコメントで指摘したように(ただし、ここでもフラグを立てます):数か月間Path::Iterator::Rule
、File::Find
. 必要perl >5.10
ですが、「アップグレードしない」という奇妙でサイトに運用コードを展開する必要はありません。5.8.*
ポリシーのみなので、Path::Iterator::Rule
絶対に外したくないモジュールの 1 つになりました。も便利ですPath::Class
。乾杯。