0

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

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

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

存在参数不是 HASH 或 ARRAY 元素,也不是 createWordIndex.pl 第 31 行的子例程。

有没有办法做这种任务?还是我只需要先检查存在,然后在条件为真时进行分配?

4

4 回答 4

4

您是否想在打印之前弄清楚那里是否存在价值?然后你必须这样做:

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

如果您知道存储的值将始终被定义,您可以这样做

if ( defined( my $wid = $dict{$w} ) ) {
    print "$wid: $c\n";
}
于 2012-12-10T15:59:56.580 回答
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";
}
于 2012-12-10T16:03:39.390 回答
0

你刚刚在你的问题中回答了你的问题。

“或者我只需要先检查存在,如果条件为真,再分配?”

代码中的exists函数采用标量 $wid。并且在您的错误中明确指出存在函数需要哈希或数组元素

存在参数不是 HASH 或 ARRAY 元素,也不是 createWordIndex.pl 第 31 行的子例程。

所以是的。您需要先检查它是否存在。

友好的建议:在提问之前尝试所有你能想到的事情/解决方案,因为你可能已经知道问题的答案。:)

于 2012-12-10T16:03:10.003 回答
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";
}
于 2012-12-10T16:04:17.800 回答