如何在Perl中检查数组中的值范围

时间:2011-10-13 08:50:06

标签: perl

我想知道在没有for循环的情况下Perl是否可行。

我有一个数组,其数字范围从1到7(可能会重复)。

我首先对数组进行排序。然后我得到最低元素。

我需要的是,如果第一个元素的值是1,那么我想检查数组是否包含(2,3,4,5)。

我可以在没有循环的情况下在一行中执行此操作吗?

2 个答案:

答案 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无用的使用,并允许在原始数组中使用重复值。