我想知道在没有for
循环的情况下Perl是否可行。
我有一个数组,其数字范围从1到7(可能会重复)。
我首先对数组进行排序。然后我得到最低元素。
我需要的是,如果第一个元素的值是1,那么我想检查数组是否包含(2,3,4,5)。
我可以在没有循环的情况下在一行中执行此操作吗?
答案 0 :(得分:3)
我不明白为什么你首先排序数组但是为了检查数组中是否存在某些值,你可以使用这种方法:
sub check2345 {
my %h;
@h{@_}=();
return 4 == grep exists $h{$_}, 2 .. 5;
}
如果您依赖一行(表达式):
do{my%h;@h{@array}=();4==grep exists$h{$_},2..5}
答案 1 :(得分:-1)
您可以使用grep
/ keys
/ map
结构在一行中执行此操作:
#!perl
use strict;
use warnings;
use 5.010;
my @arr = ( 1, 2, 4, 5 );
say "has 2, 3, 4, 5" if 4 == grep { $_ == 2 || $_ == 3 || $_ == 4 || $_ == 5 } keys %{{ map { $_ => 1 } @arr }};
如果您的元素将是整数,则可以将grep
缩短为:
grep { $_ >= 2 && $_ <= 5 }
如果你想让事情更容易支持(即如果你的结束范围可能正在改变),你可以尝试:
#!perl
use strict;
use warnings;
use 5.010;
my @arr = ( 1, 2, 4, 5 );
my $first = 2;
my $last = 5;
say "has them all" if ($last-$first+1) == grep { $_ >= $first && $_ <= $last } keys %{{ map { $_ => 1 } @arr }};
(请注意,在我的两个示例中,脚本都不应该打印,因为数组没有所有元素(2,3,4,5)。)
编辑:根据下面的Hynek评论,我删除了对map
无用的使用,并允许在原始数组中使用重复值。