16

次のような Perl ファイルがあります。

use strict;
f1();

sub f3()
{ f2(); }

sub f1()
{}
sub f2()
{}

つまり、f1定義される前に呼び出されます。そのため、Perl は次のような警告をスローします: "f1 の呼び出しが早すぎてプロトタイプをチェックできません"。ただし、 の場合も同様ですf2。唯一の違いは、別のサブルーチン内から呼び出されることです。に対して警告をスローしませんf2。なんで?

この問題を解決する最善の方法は何ですか?

  1. 呼び出される前にサブルーチンを宣言する
  2. 次のようにサブを呼び出します。&f1();
4

6 に答える 6

18

そもそもプロトタイプを使用しないことで、この問題を完全に回避できます。

use strict;

f1();

sub f3 { f2() }

sub f1 {}
sub f2 {}

プロトタイプを使用する理由がわからない場合は、プロトタイプを使用しないでください。

もちろん、これはすべて非常に強力であり、世界をより良い場所にするために適度に使用する必要があります.

于 2009-11-12T05:16:51.033 に答える
16

サブルーチン定義から () を削除するだけです。() で定義すると、Perl はこれらをプロトタイプと見なし、使用する前にプロトタイプを定義する必要があります。

これを試して:

use strict;
f1();

sub f3
{ f2(); }

sub f1
{}
sub f2
{}
于 2015-06-06T00:26:53.343 に答える
2

かっこで呼ぶのなら、なぜプロトタイプを使っているのですか?

sub f1(){ ... }

f1();

空のプロトタイプを使用するのは、定数のように機能させたいサブルーチンの場合のみです。

sub PI(){ 3.14159 }

print 'I like ', PI, ", don't you?\n";

サブルーチンの動作を別の方法とは異なるものにしたい場合を除いて、実際にはPerl5プロトタイプを使用しないことをお勧めします。

sub rad2deg($){ ... }

say '6.2831 radians is equal to ', rad2deg 6.2831, " degrees, of course.\n";

この例では、プロトタイプがない場合は括弧を使用する必要があります。そうでなければ、余分な引数を取得し、最後の文字列が出力されることはありません。

于 2009-11-12T16:12:24.103 に答える
2

f2()fromの呼び出しで警告がf3()表示されないのはバグのようです。

use strict;
use warnings;

f1();

sub f1 {
    my @a = qw(a b c);
    f2(@a);
}

sub f2(\@) { print $_[0] }

これは「a」を出力します。サブルーチン定義の順序を事前宣言f2()または交換すると、「ARRAY(0x182c054)」が出力されます。

状況の解決に関しては、状況によります。私の好みは(順番に)次のとおりです。

  1. サブルーチン定義からプロトタイプを削除します。Perl のプロトタイプは、ほとんどの人が期待することを行いません。これらは、ビルトインのように機能するサブルーチンを宣言する場合にのみ役立ちます。Perl の構文を拡張しようとしている場合を除き、それらを使用しないでください。
  2. サブルーチンは、使用する前に事前宣言してください。これにより、呼び出しに遭遇する前に、Perl はプロトタイプについて知ることができます。
  3. サブルーチン定義が呼び出しの前に現れるように、コードを並べ替えます。
  4. 表記法を使用してサブルーチンを呼び出し、&foo()プロトタイプ チェックをバイパスします。
于 2009-11-12T14:47:35.163 に答える