我正在寻找列表中是否存在某个元素。
在Python中有一个in
关键字,我会做类似的事情:
if element in list:
doTask
Perl 中是否有等效的东西,而无需手动迭代整个列表?
UPDATE:
smartmatch 系列功能现已处于实验阶段 https://metacpan.org/pod/release/RJBS/perl-5.18.0/pod/perldelta.pod#The-smartmatch-family-of-features-are-now-experimental
智能匹配在 v5.10.0 中添加,并在 v5.10.1 中进行了重大修改,一直是人们经常抱怨的地方。尽管它在很多方面都很有用,但它也被证明给 Perl 的用户和实现者带来了问题和困惑。关于如何最好地解决该问题已经提出了许多建议。很明显,智能匹配几乎肯定会在未来发生变化或消失。不建议依赖其当前行为。
现在,当解析器看到 ~~、given 或 when 时,将发出警告。
如果您不需要 Perl v5.10,那么您可以使用以下任何示例。
-
The 智能匹配~~ http://perldoc.perl.org/perlsyn.html#Smart-matching-in-detail操作员。
if( $element ~~ @list ){ ... }
if( $element ~~ [ 1, 2, 3 ] ){ ... }
-
您还可以使用given/when http://perldoc.perl.org/perlsyn.html#Switch-statements构造。它在内部使用智能匹配功能。
given( $element ){
when( @list ){ ... }
}
-
您还可以使用for
循环作为“主题化器”(意味着它设置$_
).
for( @elements ){
when( @list ){ ... }
}
Perl 5.12 中将出现的一件事是能够使用后修复版本when
。这使得它更像if
and unless
.
given( $element ){
... when @list;
}
如果您必须能够在旧版本的 Perl 上运行,仍然有多种选择。
-
您可能认为您可以使用列表::实用程序::第一个 http://perldoc.perl.org/List/Util.html#first-BLOCK-LIST,但是有一些边缘条件会导致出现问题。
在这个例子中,很明显我们想要成功匹配0
。不幸的是这段代码会打印failure
每次。
use List::Util qw'first';
my $element = 0;
if( first { $element eq $_ } 0..9 ){
print "success\n";
} else {
print "failure\n";
}
你可以检查一下返回值first http://perldoc.perl.org/List/Util.html#first-BLOCK-LIST为了定义性,但如果我们真的想要匹配,那将会失败undef
成功。
-
您可以放心使用grep http://perldoc.perl.org/functions/grep.html然而。
if( grep { $element eq $_ } 0..9 ){ ... }
这是安全的,因为grep
在标量上下文中被调用。在标量上下文中调用时,数组返回元素的数量。所以即使我们尝试匹配,这也会继续起作用undef
.
-
您可以使用封闭的for
环形。只要确保你打电话last
,在成功匹配时退出循环。否则,您可能会多次运行代码。
for( @array ){
if( $element eq $_ ){
...
last;
}
}
-
你可以把for
在条件内循环if
陈述 ...
if(
do{
my $match = 0;
for( @list ){
if( $element eq $_ ){
$match = 1;
last;
}
}
$match; # the return value of the do block
}
){
...
}
-
...但是把for
之前循环if
陈述。
my $match = 0;
for( @list ){
if( $_ eq $element ){
$match = 1;
last;
}
}
if( $match ){ ... }
-
如果您只匹配字符串,您也可以使用哈希。这可以加速你的程序,如果@list
很大and,你将要匹配%hash
几次。特别是如果@array
不会改变,因为那样你只需要加载%hash
once.
my %hash = map { $_, 1 } @array;
if( $hash{ $element } ){ ... }
-
您也可以制作自己的子程序。这是有用的情况之一原型 http://perldoc.perl.org/perlsub.html#Prototypes.
sub in(&@){
local $_;
my $code = shift;
for( @_ ){ # sets $_
if( $code->() ){
return 1;
}
}
return 0;
}
if( in { $element eq $_ } @list ){ ... }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)