ambos métodos en el puesto aceptado le dan la respuesta equivocada si @test = (undef, '')
. Es decir, declaran que un valor indefinido es igual a la cadena vacía.
Eso podría ser aceptable. Además, el uso de grep
pasa por todos los elementos de la matriz, incluso si se encuentra una falta de coincidencia desde el principio y el uso del hash más que duplica la memoria utilizada por los elementos de la matriz. Ninguno de estos sería un problema si tiene matrices pequeñas. Y, es probable que grep
sea lo suficientemente rápido para un tamaño de lista razonable.
Sin embargo, aquí es una alternativa que 1) devuelve false para (undef, '')
y (undef, 0)
, 2) no aumenta el consumo de memoria de su programa y 3) cortocircuitos tan pronto como una falta de coincidencia se encuentra:
#!/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;
}
Sin embargo, el uso de List::MoreUtils::first_index es probable que sea más rápido:
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;
}
La calidad de su solución depende realmente de lo que está haciendo en ese bucle foreach. Sí, hay muchas formas de hacerlo, pero ¿por qué siente que le falta su solución actual? –
¿Por qué no codifica y publica esa solución "foreach", para que podamos comentar? – lexu
a todos los carteles preocupados por undef, no asumiría que "comprueba si cada elemento de la matriz es la misma cadena" incluye la posibilidad de undefs; se define una "cadena" por definición :). (aunque sin duda es algo que debe tener en cuenta) – ysth