Existen varias formas de detectar una matriz en Perl, cada una con diferentes funcionalidades.
Dadas las siguientes variables:
my $array = [1, 2, 3];
my $arrayobj = bless [1, 2, 3] => 'ARRAY';
my $object = bless [1, 2, 3] => 'Some::Object';
my $overload = bless {array => [1, 2, 3]} => 'Can::Be::Array';
{package Can::Be::Array;
use overload fallback => 1, '@{}' => sub {$_[0]{array}}
}
la función incorporada ref
ref $array eq 'ARRAY'
ref $arrayobj eq 'ARRAY'
ref $object eq 'Some::Object'
ref $overload eq 'Can::Be::Array'
la función reftype
desde el módulo de núcleo Scalar::Util
reftype $array eq 'ARRAY'
reftype $arrayobj eq 'ARRAY'
reftype $object eq 'ARRAY'
reftype $overload eq 'HASH'
la función blessed
de Scalar :: Util que se usa principalmente para determinar si una variable contiene un objeto al que puede llamar métodos.
blessed $array eq undef
blessed $arrayobj eq 'ARRAY'
blessed $object eq 'Some::Object'
blessed $overload eq 'Can::Be::Array'
la captura de una excepción
my $x = eval {\@$array } or die [email protected]; # ok
my $x = eval {\@$arrayobj} or die [email protected]; # ok
my $x = eval {\@$object} or die [email protected]; # ok
my $x = eval {\@$overload} or die [email protected]; # also ok, since overloaded
En el último ejemplo, la \@
par elimina referencia del argumento como un ARRAY
, y luego toma inmediatamente la referencia a la misma. Esta es una operación transparente que devuelve el mismo valor si ese valor es ARRAY
. Si el valor está sobrecargado, devolverá la matriz ref que creó el módulo. Sin embargo, si no se puede desreferenciar el valor como ARRAY
, perl lanzará una excepción.
=> Lo invito a usar nombres de variables y campos más largos, ayuda mucho con la legibilidad (especialmente cuando vuelve a algún código que escribió hace un tiempo). @Claudiu => nadie aprecia que envíes spam la pregunta; es genial que te guste Python, guárdalo para las preguntas de Python –