7

サブルーチンにスカラーを渡すことは実際には参照を渡すことであることは知っていますが、私は perl を初めて使用するので、次のテストを行いました。

#!/usr/bin/perl
$i = 2;
subr(\$i);
sub subr{
    print $_[0]."\n";
    print $$_[0]."\n";
}

最初の行は住所を出力し、2 行目は番号を返すと思っていましたが、2 行目は空行です。私は他の誰かからこれを行うように指摘されました:${$_[0]}そしてそれは番号を出力します。しかし、{} がないと機能しない理由と、{} を使用すると機能する理由がわかりませんでした。それで、何が起こったのですか?

4

4 に答える 4

16

これは、2 番目の print ステートメントがこれを行うことと同等であるためです...

my $x = $$_; print $x[0];

欲しいものがあるとき

my $x = $_[0]; print $$x;

つまり、逆参照は、配列の添字が評価される前に発生します。

これらの curl-wurlies を追加すると、Perl に式を必要に応じて解釈する方法が伝えられます。最初に評価$_[0]し、次に逆参照して値を取得します。

于 2011-05-03T15:32:38.450 に答える
8

それは評価の順序です。

  $$_[0] is evaluated as {$$_}[0]

これは、スカラー変数 $_ の参照の 0 番目の要素です。最初に参照を取得してから、その 0 番目の要素を見つけようとしています。

  ${$_[0]}

これは、配列 @_ の 0 番目の要素への参照です。最初に0番目の要素を見つけてから、その参照を取ります。

use strictコードの先頭にandを設定するとuse warnings、最初の試行から未定義の値に関する多くの警告が表示されます。

于 2011-05-03T15:33:28.700 に答える
3

$$_[0]$foo[0]配列名の代わりに $_ があるだけです。これは、 $_ が配列参照として扱われ、式がスカラー参照$_[0]をまったく含まないことを意味します。 別の構文$_->[0]を使用すると同等です。->逆参照の構文は恣意的で覚えにくいように思えるかもしれませんが、根底には意味と秩序があります。非常に優れたプレゼンテーションがhttp://perlmonks.org/?node=References+quick+referenceにあります。

于 2011-05-03T17:19:49.533 に答える
1

への参照を渡す必要はありません$i。表記$_[0]は、として呼び出すときのエイリアスです。$isubr( $i )

use strict;
use warnings;
use Test::More tests => 2;

sub subr{ $_[0]++ } # messing with exactly what was passed first
my $i=2;
is( $i, 2, q[$i == 2] );
subr($i);
is( $i, 3, q[$i == 3] );

別の例は次のとおりです。

use strict;
use warnings;
use Test::More tests => 6;
use Test::Exception;

sub subr{ $_[0]++ }
my $i=2;
is( $i, 2, q[$i == 2] );
subr($i);
is( $i, 3, q[$i == 3] );

sub subr2 { $_[0] .= 'x'; }
dies_ok { subr2( 'lit' ); } 'subr2 *dies* trying to modify a literal';
lives_ok { 
    my $s = 'lit';
    subr2( $s );
    is( $s, 'litx', q[$s eq 'litx'] );
    subr2(( my $s2 = 'lit' ));
    is( $s2, 'litx', q[$s2 eq 'litx'] );
} 'subr2 lives with heap variables';

出力:

ok 1 - $i == 2
ok 2 - $i == 3
ok 3 - subr2 *dies* trying to modify a literal
ok 4 - $s eq 'litx'
ok 5 - $s2 eq 'litx'
ok 6 - subr2 lives with heap variables
1..6
于 2011-05-03T16:29:16.547 に答える