1

perl でハッシュの参照と逆参照がどのように機能するかを理解するのに苦労しています。

次のように定義された 3 つのレベルのハッシュがあります。

%languages = ( 
               'en', ( 
                       'it', ( 'pattern1', '...', 'pattern2', '...' )
                       'de', ( 'pattern1', '...', 'pattern2', '...' )
                     ) 
               'it', ( 
                       'en', ( 'pattern1', '...', 'pattern2', '...' )
                       'de', ( 'pattern1', '...', 'pattern2', '...' )
                     )
               'de', ( 
                       'en', ( 'pattern1', '...', 'pattern2', '...' )
                       'it', ( 'pattern1', '...', 'pattern2', '...' )
                     )
             );

次のように、最初のレベルのハッシュの 1 つの 2 番目のレベルで反復します。

my $current_language = 'de';
while ( ( my $language, my $patterns ) = each %{ $languages{ $current_language } } )
{
  print $patterns->{'pattern1'};
}

しかし、私は次のエラーが発生します

Can't use string ("en") as a HASH ref while "strict refs" in use

これについて何か助けていただければ幸いです。

4

2 に答える 2

11

Perl では、括弧は優先順位のみを並べ替えます。次の 2 行は同等です。

(1, 2, 3)
(1, (2, (3)))

したがって、実際に割り当てています

( 
  en       => 'it',
  pattern1 => '...',
  pattern2 => '...' ,
  de       => 'pattern1'
  '...'    => 'pattern2'
  '...'    =>'it',
  en       => 'pattern1',
  ... # I think you got it …
);

実際にはネストされたハッシュを持つことはできませんが、ネストされたハッシュへの参照です。hashrefリテラルおよびarrayref リテラル{ foo => 2}使用できます。[1, 2, 3]

%languages = ( 
           en => { 
                   it => ['pattern1', 'pattern2'],
                   de => ['pattern1', 'pattern2'],
                 },
           ...,
         );

while (my($lang, $patterns) = each $languages{de}) {
  print "$lang has [@$patterns]\n";
}

注: =>(別名「太いコンマ」演算子) はコンマと同じ演算子ですが、キーと値の関係を強調するために使用できます (また、左側の引用符で囲まれていない文字列 (裸の単語) に自動的に引用符を追加すると便利です。つまり、ハッシュキー)。

于 2013-08-30T16:09:58.803 に答える
5

Perl のハッシュ値はスカラーでなければならず、リスト (またはハッシュを表すリスト) をハッシュ値として割り当てようとしているようです。幸いなことに、ハッシュ参照はスカラーです。あなたが書きたかったのは次のことだと思います:

%languages = ( 

           'en', {
                   'it', { 'pattern1', '...', 'pattern2', '...' },
                   'de', { 'pattern1', '...', 'pattern2', '...' }
                 }, 
           'it', { 
                   'en', { 'pattern1', '...', 'pattern2', '...' },
                   'de', { 'pattern1', '...', 'pattern2', '...' }
                 },
           'de', { 
                   'en', { 'pattern1', '...', 'pattern2', '...' },
                   'it', { 'pattern1', '...', 'pattern2', '...' }
                 }
         );
于 2013-08-30T16:09:30.240 に答える