我很难理解哈希的引用和解引用是如何工作的.
我有一个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)
注:=>(又名" 胖逗号 "运营商)是同一个运营商的逗号,但可以用来强调一个键值关系(和它的左侧方便地自动添加引号未加引号的字符串(裸字) -即哈希键).
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)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |