在下面的代码中,为什么第一个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。
发布于 2013-08-14 23:02:08
因为数组和列表不是一回事。
$v ~~ @keys_h是将标量与数组相匹配,如果标量匹配数组的一个元素,则返回true (Any vs 智能匹配行为图中的Array )。
$v ~~ keys %h是将标量与列表进行匹配。不存在与列表匹配的规则,因此在标量上下文中对列表进行计算,如
$v ~~ scalar(keys %h)它决定
"two" ~~ 2它现在是一个数字比较(Any与Num),它触发警告。
$v ~~ [ keys %h ]也会做你想做的事。
https://stackoverflow.com/questions/18243584
复制相似问题