由于我对Perl知之甚少,我很惊讶这种语法不起作用:
if (exists $wid = $dict{$w}) {
print "$wid:$c\n";
}
似乎我无法进行作业$wid = $dict{$w}
并检查它是否同时存在:
exists参数不是HASH或ARRAY元素或子程序 createWordIndex.pl第31行。
有没有办法做这种作业?或者我只需先检查存在,然后在条件成立时进行分配?
答案 0 :(得分:4)
你打算在打印之前弄清楚它是否有价值?然后你必须这样做:
if ( exists($dict{$w}) ) {
my $wid = $dict{$w};
print "$wid: $c\n";
}
如果您知道将始终定义存储的值,则可以执行
if ( defined( my $wid = $dict{$w} ) ) {
print "$wid: $c\n";
}
答案 1 :(得分:1)
或者(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";
}
答案 2 :(得分:0)
您刚才在问题中回答了您的问题。
“或者我只需先检查存在,然后在条件成立时进行分配?”
代码中的存在函数会占用标量$ wid。并且在您的错误中明确指出存在函数需要哈希或数组元素
是的,是的。你需要先检查它是否存在。 友情提示:在询问之前尝试您能想到的所有事情/解决方案,因为您可能已经知道问题的答案。 :)exists参数不是HASH或ARRAY元素或createWordIndex.pl第31行的子例程。
答案 3 :(得分:0)
你可以这样做,只需跳过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";
}