use List::MoreUtils 'any';
my @list = qw(foo bar baz);
my $exists = any { $_ eq 'foo' } @list;
print 'foo ', ($exists ? 'is' : 'is not'), " a member of the list\n";
$exists = any { $_ eq 'blah' } @list;
print 'blah ', ($exists ? 'is' : 'is not'), " a member of the list\n";
# if Perl 5.18 or higher; otherwise not needed
no warnings 'experimental::smartmatch';
my @filter = qw(X Y Z);
my $not_in_filter = scalar grep { ! ($_ ~~ @filter) } @array;
my %seen;
@seen{ @arr } = (); # Create a key for every distinct value in @arr
delete @seen{ qw(x y z) }; # And remove the ones for x, y, and z
if (keys %seen) {
# There was something in @arr that's not x, y, or z
} else {
# There wasn't
}
use List::Member;
my $target = 'bar';
my @look_in = ('foo','baz','bar','etc');
if( member($target, @look_in) + 1) {
print "It's a member of the array\n";
}
6条答案
按热度按时间wgmfuz8q1#
库List::Util或List::MoreUtils在这里对于测试列表成员关系非常有用,在这里您不关心值本身,而只关心是否存在。它们比
grep
更高效,因为一旦找到匹配,它们就停止循环遍历列表,这确实可以加快长列表的速度。此外,这些模块是用C/XS编写的,这比任何纯Perl实现都要快。(If如果您被限制只能使用核心Perl附带的模块,您可以在List::Util中使用
first
-它在5.7.3中首次随Perl一起提供。)h9vpoimq2#
解决这个问题的典型方法是使用哈希:
lb3vh1jj3#
如果您使用的是Perl 5.10或更高版本,愿意在Perl 5.18及更高版本中使用一个实验性特性,并且愿意忽略***特性计划在5.38***中被弃用,那么Smart Match操作符将完成您想要的操作。
如果Filter和/或@array很大,它可能会很慢,因为它是O(N^2)。在这种情况下,您仍然可以使用智能匹配,只需更改您的过滤器:
有关详细信息,请参阅
perldoc perlsyn
中的智能匹配详细信息。此外,如果您需要支持5.10和5.18之间的Perl版本,请考虑使用cpan模块
experimental
。这会进行版本检查,如果发现需要它的Perl版本,则会包括“无警告”。参见:https://search.cpan.org/~leont/experimental-0.016/lib/experimental.pm
izj3ouym4#
如果数组中有少于几百万个不同的东西,你也可以使用教科书中的方法来使用哈希来设置差异:
bbuxkriu5#
~~在数组中
这被称为smartmatch,有些人建议不要使用它们,但它们在字符串列表中工作得很好。
laximzn56#
那就可以了