为什么smartmatch对密钥%h失败并给出“参数不是数字”警告?

时间:2013-08-14 22:47:11

标签: perl hash smartmatch

在下面的代码中,为什么第一个smartmatch无法匹配并发出警告Argument "two" isn't numeric in smart match,而第二个smartmatch按预期工作(匹配)?

use strict;
use warnings;
use feature 'say';

my %h = ("one" => "un", "two" => "deux");
my $v = "two";
my @keys_h = keys %h;

say "matches first form"  if $v ~~ keys %h; # warning, doesn't match
say "matches second form" if $v ~~ @keys_h; # no warning, matches

我意识到我可以使用

$v ~~ %h

但我想知道为什么第一个smartmatch不能像我期望的那样工作。我正在使用Perl 5.10.1。

1 个答案:

答案 0 :(得分:3)

因为数组和列表不是一回事。

$v ~~ @keys_h

将标量与数组匹配,(smart match behavior chart中的Any vs Array)如果标量与数组的元素匹配则返回true。

$v ~~ keys %h

将标量与列表匹配。没有匹配列表的规则,因此列表在标量上下文中进行评估,例如

$v ~~ scalar(keys %h)

解析为

"two" ~~ 2

现在是一个数字比较(AnyNum),会触发警告。

$v ~~ [ keys %h ]

也可以做你想做的事。