4

( $$ )このコードで何をするか。私は長い間 Perl をプログラミングしてきましたが、最近非常に古い Perl .plx ファイルを開くまで、この構文に出くわすことはありませんでした。

これらの行が原因で、より最新の Perl バージョンにアップグレードできません。

sub help( $$ ){

}

それが私に影響を与える理由は、ヘルプ関数が宣言される前に呼び出されたことを示すエラーメッセージが表示されるためです。( $$ ) ブロックを削除せずにこれを解決する方法はありますか??

4

3 に答える 3

8

はプロトタイプと呼ばれます。この特定のものは、サブルーチンが正確に 2 つのスカラー変数で呼び出されることを期待していることを示しています。プロトタイプは便利な場合もありますが、ほとんどの場合、そうではありません。

それらを削除できるかどうかは、コードの残りの部分に依存します...

于 2012-10-25T08:10:48.430 に答える
7

これは、サブルーチンが受け取る引数の数と型を指定するために使用される関数プロトタイプです。ドキュメントを参照してください。

現在のドキュメントに記載されているため、アップグレードを妨げている理由がわかりません。

あなたが得ているエラーhelp called too early to check prototypeですか?perldiagドキュメントからの説明は次のとおりです。

(W プロトタイプ) パーサーがその定義または宣言を認識する前に、プロトタイプを持つ関数を呼び出しました。Perl は、呼び出しがプロトタイプに準拠しているかどうかをチェックできませんでした。問題のサブルーチンの初期のプロトタイプ宣言を追加するか、サブルーチン定義を呼び出しの前に移動して、適切なプロトタイプ チェックを取得する必要があります。または、関数を正しく呼び出していることが確実な場合は、名前の前にアンパサンドを付けて、警告を回避することができます。perlsub を参照してください。

于 2012-10-25T08:11:35.257 に答える
2

試作品です。は$$help関数が 2 つの引数を想定し、それぞれがスカラー コンテキストで評価される必要があることを指定します。これは、それらがスカラー値であることを意味しないことに注意してください! Perl のプロトタイプは、他の言語のプロトタイプとは異なります。それらを使用すると、組み込み関数のように動作する関数を定義できます。括弧はオプションであり、コンテキストは引数に課せられます。

sub f($$) { print "@_\n" }
my @a = ('a' .. 'c');
f(@a, 'd'); # prints "3 d"

あなたが見ているエラーメッセージは

help() called too early to check prototype

これは、Perl が関数の宣言を確認してプロトタイプを認識する前に、関数の呼び出しを確認したことを意味します。これは、プロトタイプが強制されておらず、呼び出しが期待どおりに動作しない可能性があることを意味します。

my @a = ('a' .. 'c');
f(@a, 'd'); # prints "a b c d"
sub f($$) { print "@_\n" }

エラーを修正するには、呼び出しの前にサブルーチン定義を移動するか、呼び出しの前に宣言を追加する必要があります。

sub f($$); # forward declaration
my @a = ('a' .. 'c');
f(@a, 'd'); # prints "3 d"
sub f($$) { print "@_\n" }

これらはすべて、新しいバージョンの Perl にアップグレードできるかどうかとはまったく関係ありません。

于 2012-10-25T17:23:24.880 に答える