Вы можете сделать это в одну строку, используя конструкцию 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
to:
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)).
Редактировать: Основано на комментарии Хайнеканиже я удалил бесполезное использование map
и допустил дублирование значений в исходном массиве.