以这种方式访问​​哈希有什么问题?

nuc*_*cka 1 perl hash

我很难理解哈希的引用和解引用是如何工作的.

我有一个3级的哈希定义如下:

%languages = ( 
               'en', ( 
                       'it', ( 'pattern1', '...', 'pattern2', '...' )
                       'de', ( 'pattern1', '...', 'pattern2', '...' )
                     ) 
               'it', ( 
                       'en', ( 'pattern1', '...', 'pattern2', '...' )
                       'de', ( 'pattern1', '...', 'pattern2', '...' )
                     )
               'de', ( 
                       'en', ( 'pattern1', '...', 'pattern2', '...' )
                       'it', ( 'pattern1', '...', 'pattern2', '...' )
                     )
             );
Run Code Online (Sandbox Code Playgroud)

并希望迭代第一级哈希之一的第二级,如下所示:

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

但我得到以下错误

Can't use string ("en") as a HASH ref while "strict refs" in use
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助.

amo*_*mon 11

在Perl中,parens 只能排除优先级.以下两行是等效的:

(1, 2, 3)
(1, (2, (3)))
Run Code Online (Sandbox Code Playgroud)

因此,您实际上正在分配

( 
  en       => 'it',
  pattern1 => '...',
  pattern2 => '...' ,
  de       => 'pattern1'
  '...'    => 'pattern2'
  '...'    =>'it',
  en       => 'pattern1',
  ... # I think you got it …
);
Run Code Online (Sandbox Code Playgroud)

实际上你不能有嵌套的哈希值,而是对嵌套哈希值的引用.你可以用{ foo => 2}一个文字hashref,并[1, 2, 3]数组引用文字:

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

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

注:=>(又名" 胖逗号 "运营商)是同一个运营商的逗号,但可以用来强调一个键值关系(和它的左侧方便地自动添加引号未加引号的字符串(裸字) -即哈希键).

  • @TLP - "自动引用它的LHS参数"并不完全是我在与新手沟通时说出的想法:) (3认同)
  • `=>`还自动引用其LHS参数. (2认同)

mob*_*mob 5

Perl中的哈希值必须是标量,看起来您正在尝试将列表(或表示哈希的列表)指定为哈希值.幸运的是,哈希引用是标量.我想你的意思是:

%languages = ( 

           'en', {
                   'it', { 'pattern1', '...', 'pattern2', '...' },
                   'de', { 'pattern1', '...', 'pattern2', '...' }
                 }, 
           'it', { 
                   'en', { 'pattern1', '...', 'pattern2', '...' },
                   'de', { 'pattern1', '...', 'pattern2', '...' }
                 },
           'de', { 
                   'en', { 'pattern1', '...', 'pattern2', '...' },
                   'it', { 'pattern1', '...', 'pattern2', '...' }
                 }
         );
Run Code Online (Sandbox Code Playgroud)