3

@_ を使用して単一の引数を Perl サブルーチンに渡しているときに、奇妙なバグに遭遇しました。サブルーチンに渡された値は、サブルーチンに入った直後に変更されます。

コード例:

my $my_def = 0;
print "my_def = $my_def \n";
@someResult = doSomething($my_def);

sub doSomething {
    my $def = @_;
    print "def = $def \n";
    ...
}

これは以下を返しました:

> my_def = 0
> def = 1  # instead of "0"

もう 1 つの奇妙な点は、コードが数か月前までは正しく機能していたことです。

次のように変更すると、問題は解決しました。

sub doSomething {
    my $def = $_[0];

誰が問題の原因を教えてもらえますか? @_ を使用して単一の引数を渡すことに制限はありますか?

ありがとう!

4

3 に答える 3

13

期待したものではありませんが、正しい動作が得られます。

サブルーチンの引数からローカル変数を取得するための簡単な経験則は、my (...)宣言内の変数リストを常に括弧で囲むことです。

sub do_something
{
    my ($def) = @_;
    ...
}

違いは、リスト コンテキストとスカラー コンテキストの違いです。スカラー コンテキストでは、すべての配列は配列内の要素数を返します。この場合は 1 です。そして、あなたが書いたとき、my $def = @_スカラーコンテキストを提供しました。代わりに使用my $def = $_[0]すると、配列の要素ゼロに明示的にアクセスしました。これはスカラー (したがって、$印章) であるため、すべてが再び機能しました。

一般的なケースでは、次のような場合があります。

sub do_something_else
{
    my ($arg1, $arg2, $arg3, @the_rest) = @_;
    ...
}

これで、3 つのスカラー ローカル変数 、$arg1$arg2および と、渡された追加の引数を収集する$arg31 つの配列ができました。@the_rest

于 2013-03-11T07:12:40.560 に答える
1

The answer is simple when a array assigned to scalar value it returns number of elements in the array

于 2013-03-11T07:15:35.740 に答える
1

それはすべてコンテキストに関するものです。次に例を示します。

@data = (0, 1, 2);

$count = @data;        # imply in scalar context
### $count: 3

$count = scalar @data; # same as above, but force scalar context
### $count: 3

$first = $data[0];     # both sides are in scalar context
### $first: 0

($first) = @data;      # both sides are in list context   
### $first: 0

$first = shift @data;  # get the first, but @data was modified
### $first: 0
### @data: (1, 2)

($second, $third) = @data;
### $second: 1
### $third: 2
于 2013-03-11T07:25:01.023 に答える