在Perl的~~对面

dre*_*res 7 perl

~~Perl中的运营商是否存在相反的情况?我用它来匹配数组中的元素,如下所示:

my @arr = qw /hello ma duhs udsyyd hjgdsh/;
print "is in\n" if ('duhs' ~~ @arr);
Run Code Online (Sandbox Code Playgroud)

这打印is in.这很酷,因为我没有迭代所有数组并比较每条记录.我的问题是,如果我没有匹配,我想做点什么.我可以站在else一边,但我宁愿找到相反的"~~"

Lee*_*eft 12

您也可以使用List::Util(仅此模块的新版本)或List::MoreUtilsany,none和朋友.

use List::Util qw(any none);
my @arr = qw /hello ma duhs udsyyd hjgdsh/;
say "oh hi" if any { $_ eq 'hello' } @arr;
say "no goodbyes?" if none { $_ eq 'goodbye' } @arr;
Run Code Online (Sandbox Code Playgroud)

虽然不是perl-native,但它不需要实验性的智能匹配.

  • `corelist -a List :: Util`似乎认为5.19.4包括1.32而5.19.5使用1.35.所以5.20.0(目前)是开箱即用的唯一稳定版本. (2认同)

Mig*_*Prz 9

除非==如果没有

print "is not in\n" unless ('duhs' ~~ @arr);
Run Code Online (Sandbox Code Playgroud)

注意:智能匹配在perl 5.18+中是实验性的.请参阅5.18中的智能匹配是实验/折旧 - 建议?所以请使用以下代码:

print "is not in\n" unless grep { $_ eq 'duhs' } @arr;
Run Code Online (Sandbox Code Playgroud)