分配变量并检查是否存在散列键

时间:2012-12-10 15:51:45

标签: perl

由于我对Perl知之甚少,我很惊讶这种语法不起作用:

if (exists $wid = $dict{$w}) {
 print "$wid:$c\n";
}

似乎我无法进行作业$wid = $dict{$w}并检查它是否同时存在:

  

exists参数不是HASH或ARRAY元素或子程序   createWordIndex.pl第31行。

有没有办法做这种作业?或者我只需先检查存在,然后在条件成立时进行分配?

4 个答案:

答案 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";
}