由于我对 Perl 知之甚少,我很惊讶这种语法不起作用:
if (exists $wid = $dict{$w}) {
print "$wid:$c\n";
}
似乎我无法进行分配$wid = $dict{$w}
并检查它是否同时存在:
存在参数不是 HASH 或 ARRAY 元素,也不是 createWordIndex.pl 第 31 行的子例程。
有没有办法做这种任务?还是我只需要先检查存在,然后在条件为真时进行分配?
由于我对 Perl 知之甚少,我很惊讶这种语法不起作用:
if (exists $wid = $dict{$w}) {
print "$wid:$c\n";
}
似乎我无法进行分配$wid = $dict{$w}
并检查它是否同时存在:
存在参数不是 HASH 或 ARRAY 元素,也不是 createWordIndex.pl 第 31 行的子例程。
有没有办法做这种任务?还是我只需要先检查存在,然后在条件为真时进行分配?
您是否想在打印之前弄清楚那里是否存在价值?然后你必须这样做:
if ( exists($dict{$w}) ) {
my $wid = $dict{$w};
print "$wid: $c\n";
}
如果您知道存储的值将始终被定义,您可以这样做
if ( defined( my $wid = $dict{$w} ) ) {
print "$wid: $c\n";
}
或者(毕竟是 TIMTOWTDI),您可以使用智能匹配运算符(对于 Perl 版本 >= 5.10):
if($w ~~ (keys %dict))
{
my $wid = $dict{$w};
print "$wid: $c\n";
}
或者,或者:
if(grep{$w eq $_}(keys %dict))
{
my $wid = $dict{$w};
print "$wid: $c\n";
}
你刚刚在你的问题中回答了你的问题。
“或者我只需要先检查存在,如果条件为真,再分配?”
代码中的exists函数采用标量 $wid。并且在您的错误中明确指出存在函数需要哈希或数组元素
存在参数不是 HASH 或 ARRAY 元素,也不是 createWordIndex.pl 第 31 行的子例程。
所以是的。您需要先检查它是否存在。
友好的建议:在提问之前尝试所有你能想到的事情/解决方案,因为你可能已经知道问题的答案。:)
你可以做到,只需跳过exists
. 如果进行了分配(因为有 $dict{$w}),则副作用为真。
my %dict;
$dict{one} = 1;
$dict{two} = 2;
$dict{three} = 3;
if ($wid = $dict{four}) {
print "$wid\n";
}
else {
print "NO!\n";
}