首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么smartmatch与键%h匹配失败,并给出“参数不是数字”警告?

为什么smartmatch与键%h匹配失败,并给出“参数不是数字”警告?
EN

Stack Overflow用户
提问于 2013-08-14 22:47:10
回答 1查看 781关注 0票数 1

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

代码语言:javascript
复制
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

我意识到我可以用

代码语言:javascript
复制
$v ~~ %h

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-14 23:02:08

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

代码语言:javascript
复制
$v ~~ @keys_h

是将标量与数组相匹配,如果标量匹配数组的一个元素,则返回true (Any vs 智能匹配行为图中的Array )。

代码语言:javascript
复制
$v ~~ keys %h

是将标量与列表进行匹配。不存在与列表匹配的规则,因此在标量上下文中对列表进行计算,如

代码语言:javascript
复制
$v ~~ scalar(keys %h)

它决定

代码语言:javascript
复制
"two" ~~ 2

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

代码语言:javascript
复制
$v ~~ [ keys %h ]

也会做你想做的事。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18243584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档