Как проверить диапазон значений в массиве в Perl - PullRequest
0 голосов
/ 13 октября 2011

Мне интересно, возможно ли это в Perl без цикла for.

У меня есть массив, заполненный числами от 1 до 7 (может повторяться).

Сначала я сортирую массив. Тогда я получаю самый низкий элемент.

Что мне нужно, если значение первого элемента равно 1, то я хочу проверить, содержит ли массив (2,3,4,5).

Могу ли я сделать это в одну строку без цикла?

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Я не понимаю, почему вы сначала сортируете массив, но для проверки существования некоторых значений в массиве вы можете использовать, например, такой подход:

sub check2345 {
  my %h;
  @h{@_}=();
  return 4 == grep exists $h{$_}, 2 .. 5;
}

если вы полагаетесь на одну строку (выражение):

do{my%h;@h{@array}=();4==grep exists$h{$_},2..5}
0 голосов
/ 13 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...