2

わかりました、私はperlハッシュスライスとPerlの「x」演算子を理解していますが、誰かがここから次のコード例を説明できますか(少し簡略化されています)?

sub test{
    my %hash;
    @hash{@_} = (undef) x @_;
}

subへの呼び出しの例:

test('one', 'two', 'three');

この行は私を投げるものです:

@hash{@_} = (undef) x @_;

キーがサブへのパラメーターであり、undefに初期化するハッシュを作成しているので、次のようになります。

%ハッシュ:

'one' => undef、'two' => undef、'three' => undef

x演算子の右辺値は数値である必要があります。@_がサブのパラメータ配列の長さとしてどのように解釈されるのですか?私はあなたが少なくともこれをしなければならないと思うでしょう:

@hash{@_} = (undef) x scalar @_;
4

2 に答える 2

10

このコードを理解するには、次の3つのことを理解する必要があります。

繰り返し演算子。x演算子は繰り返し演算子です。リストのコンテキストでは、演算子の左側の引数が括弧で囲まれている場合、リスト内の項目が繰り返されます。

my @x = ('foo') x 3;  # ('foo', 'foo', 'foo')

スカラーコンテキストの配列。配列がスカラーコンテキストで使用される場合、そのサイズを返します。演算子はx、右側の引数にスカラーコンテキストを課します。

my @y = (7,8,9);
my $n = 10 * @y; # $n is 30

ハッシュスライス。ハッシュスライス構文は、一度に複数のハッシュアイテムにアクセスする方法を提供します。ハッシュスライスは、ハッシュ値を取得することも、に割り当てることもできます。手元のケースでは、ハッシュスライスに割り当てています。

# Right side creates a list of repeated undef values -- the size of @_.
# We assign that list to a set of hash keys -- also provided by @_.
@hash{@_} = (undef) x @_;

同じことを行うためのあまり目立たない方法:

@hash{@_} = ();
$hash{$_} = undef for @_;
于 2010-06-03T21:36:11.633 に答える
0

スカラーコンテキストでは、配列はその長さに評価されます。差出人perldoc perldata

スカラーコンテキストで配列を評価すると、配列の長さが返されます。(これは、Cコンマ演算子のように最後の値を返すリストや、戻りたいと思うものを返す組み込み関数には当てはまらないことに注意してください。)

現在、これ以上の情報は見つかりませんが、レプリケーション演算子がスカラーコンテキストで2番目の引数を評価し、配列の長さを評価しているようです。

于 2010-06-03T21:03:14.197 に答える