3

次のファイルはコンパイルされません。

sub s {
    return 'foo';
}
sub foo {
    my $s = s();
    return $s if $s;
    return 'baz?';
}

からのエラーperl -cは次のとおりです。

syntax error at foobar.pl line 5 near "return"
  (Might be a runaway multi-line ;; string starting on line 3)
foobar.pl had compilation errors.

しかし、私はそれを置き換えるs()とうまくいき&s()ます。理由を説明できますか?

4

3 に答える 3

13

& プレフィックスは、同じ名前の組み込み関数ではなく、"s" という独自の関数を呼び出したいことを明確に示しています。この場合、置換演算子 ( のよう$stuff =~ s///;に、 と書くこともできますs()()) と混同しています。

以下は、アンパサンドの機能に関する PerlMonks のディスカッションです。

于 2013-02-28T15:41:32.257 に答える
3

すでに指摘されているように、問題は置換演算子s()として解釈されることです。s///関数名の前にアンパサンドを付けることは回避策ですが、必ずしも正しいとは言えません。perldoc perlsubでは、サブルーチンの呼び出しについて次のように述べられています:

NAME(LIST);  # & is optional with parentheses.
NAME LIST;   # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME;       # Makes current @_ visible to called subroutine.

ここでアンパサンドが行うことは、組み込み関数と独自の関数を区別することだけです。

サブルーチンの名前を変更する以外に、これに対処する「適切な」方法は、水面下で何が起こっているかを理解することです。あなたが言う時

s();

あなたが本当に言っていることは

CORE::s();  

あなたが意味するときは

main::s();
于 2013-02-28T16:03:16.097 に答える
1
 my $s = 's'->();

も機能します-奇妙なことに、stricton で十分です。

于 2013-02-28T16:03:16.427 に答える