Perl:if(列表中的元素)
我正在寻找一个元素在列表中的存在。
在Python中有一个关键字,我会做类似: if element in list: doTask 在Perl中有没有等同的东西,而不必手动遍历整个列表? 解决方法
如果你可以离开需要Perl v5.10,那么你可以使用下面的任何例子。
> smart match if( $element ~~ @list ){ ... } if( $element ~~ [ 1,2,3 ] ){ ... } >您也可以使用 given( $element ){ when( @list ){ ... } } >你也可以使用for循环作为“局部化”(意思是它设置$ _)。 for( @elements ){ when( @list ){ ... } } 在Perl 5.12中会出现的一个事情是能够使用post的fix版本。这使得它更像是如果和除非。 given( $element ){ ... when @list; } 如果你必须能够在旧版本的Perl上运行,还有几个选项。 >你可能认为你可以放弃使用List::Util::first,但有一些边缘条件,使它有问题。 在这个例子中,很明显我们想成功匹配0.遗憾的是,这段代码每次都会打印失败。 use List::Util qw'first'; my $element = 0; if( first { $element eq $_ } 0..9 ){ print "successn"; } else { print "failuren"; } 你可以检查定义的 if( grep { $element eq $_ } 0..9 ){ ... } 这是安全的,因为grep在标量上下文中被调用。数组在标量上下文中调用时返回元素的数量。所以这将继续工作,即使我们试图匹配undef。 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很大,并且你要匹配%hash几次。特别是如果@array不改变,因为那时你只需要加载%哈希一次。 my %hash = map { $_,1 } @array; if( $hash{ $element } ){ ... } >你也可以做自己的子程序。这是使用prototypes有用的情况之一。 sub in(&@){ local $_; my $code = shift; for( @_ ){ # sets $_ if( $code->() ){ return 1; } } return 0; } if( in { $element eq $_ } @list ){ ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |