6

次のようにインデックスを付けることができるハッシュがあるとします。

$hash{$document}{$word}

オンラインで読んだものから( perlreftutperldscperllolでは見つかりませんでしたが)、ハッシュの@プレフィックスを使用してハッシュにリストを返すように指示すると、リストを使用してハッシュをスライスできます。ただし、リストを使用してハッシュをスライスしようとすると、次のようになります@list

@%hash{$document}{@list}

いくつかの"Scalar values ... better written" エラーが発生します。

Perlでネストされたハッシュをスラッシュするにはどうすればよいですか?

4

2 に答える 2

8

ハッシュのシジルは、次@のようにする必要があります。

@{$hash{$document}}{@list}

@list有効なキーが含まれていると仮定すると%hash、対応する値が返されるundefか、キーが存在しない場合。

これは、ハッシュ スライスの一般的な規則に基づいています。

%foo = ( a => 1, b => 2, c => 3 );
print @foo{'a','b'};               # prints 12
%bar = ( foo => \%foo );           # foo is now a reference in %bar
print @{ $bar{foo} }{'a','b'};     # prints 12, same data as before
于 2012-09-17T17:09:45.213 に答える
4

まず、ハッシュ スライスからリストを取得する場合は、@最初に sigil を使用します。%ここでは無意味です。

$hash{$document}次に、値がハッシュや配列ではないことを理解する必要があります。これは参照です - ハッシュまたは配列へ。

以上のことから、次のようなものを使用できます。

@{ $hash{$document} }{ @list };

... の値を逆参照し$hash{$document}、その上にハッシュ スライスを使用します。例えば:

my %hash = (
    'one' => {
        'first'  => 1,
        'second' => 2,
     },
     'two' => {
        'third'  => 3,
        'fourth' => 4,
     } 
);

my $key  = 'one';
my @list = ('first', 'second');

print $_, "\n" for @{ $hash{$key} }{@list};
# ...gives 1\n2\n
于 2012-09-17T17:12:53.040 に答える