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', '...' )
                     )
             );

并希望像这样迭代第一级哈希值的第二级:

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 中,parens排序优先级。以下两行是等价的:

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

因此,您实际上是在分配

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

您实际上不能有嵌套哈希,而是对嵌套哈希的引用。您可以使用{ foo => 2}hashref文字[1, 2, 3]arrayref文字

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

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

注意:(=>又名“ fat comma ”运算符)与逗号相同,但可用于强调键值关系(并且它方便地自动将引号自动添加到左侧未加引号的字符串(裸词) - 即哈希键)。

于 2013-08-30T16:09:58.803 回答
5

Perl 中的哈希值必须是scalars,看起来您正在尝试将列表(或表示哈希的列表)分配为哈希值。幸运的是,哈希引用是标量。我想你要写的是:

%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 回答