Оба метода в принятом сообщении дают неправильный ответ, если @test = (undef, '')
. То есть они объявляют неопределенное значение равным пустой строке.
Это может быть приемлемо. Кроме того, использование grep
проходит через все элементы массива, даже если на раннем этапе обнаружено несоответствие, а использование хэша более чем вдвое увеличивает объем памяти, используемой элементами массива. Ни один из них не будет проблемой, если у вас есть небольшие массивы. И, grep
, вероятно, будет достаточно быстрым для разумных размеров списка.
Однако есть альтернатива, которая 1) возвращает false для (undef, '')
, а (undef, 0)
, 2) не увеличивает объем памяти вашей программы и 3) замыкает накоротко, как только обнаружено несоответствие: *
#!/usr/bin/perl
use strict; use warnings;
# Returns true for an empty array as there exist
# no elements of an empty set that are different
# than each other (see
# http://en.wikipedia.org/wiki/Vacuous_truth)
sub all_the_same {
my ($ref) = @_;
return 1 unless @$ref;
my $cmpv = \ $ref->[-1];
for my $i (0 .. $#$ref - 1) {
my $this = \ $ref->[$i];
return unless defined $$cmpv == defined $$this;
return if defined $$this
and ( $$cmpv ne $$this );
}
return 1;
}
Однако использование List :: MoreUtils :: first_index может быть быстрее:
use List::MoreUtils qw( first_index );
sub all_the_same {
my ($ref) = @_;
my $first = \ $ref->[0];
return -1 == first_index {
(defined $$first != defined)
or (defined and $_ ne $$first)
} @$ref;
}