strawberry logo lane historia ejemplos perl

logo - Encuentra el tamaño de una matriz en Perl



perl vs python (11)

¿Qué pasa con int(@array) ya que amenaza el argumento como escalar.

Parece que he encontrado varias formas diferentes de encontrar el tamaño de una matriz. ¿Cuál es la diferencia entre estos tres métodos?

my @arr = (2); print scalar @arr; # First way to print array size print $#arr; # Second way to print array size my $arrSize = @arr; print $arrSize; # Third way to print array size


Desde perldoc perldata , que debe ser seguro citar:

Lo siguiente siempre es cierto:

scalar(@whatever) == $#whatever + 1;

Siempre y cuando no tengas $ # lo que sea ++ y misteriosamente aumentes el tamaño o tu matriz.

Los índices de matriz comienzan con 0.

y

Puede truncar una matriz a nada asignándole la lista nula (). Los siguientes son equivalentes:

@whatever = (); $#whatever = -1;

Lo que me lleva a lo que estaba buscando, que es cómo detectar que la matriz está vacía. Lo encontré si $ # vacío == -1;


Ejemplo:

print $#arr + 1; # Second way to print array size


Esto obtiene el tamaño forzando la matriz en un contexto escalar, en el que se evalúa como su tamaño:

print scalar @arr;

Esta es otra forma de forzar la matriz en un contexto escalar, ya que se asigna a una variable escalar:

my $arrSize = @arr;

Esto obtiene el índice del último elemento de la matriz, por lo que en realidad es el tamaño menos 1 (suponiendo que los índices comienzan en 0, que es ajustable en Perl, aunque hacerlo es una mala idea):

print $#arr;

Este último no es realmente bueno para usar para obtener el tamaño del arreglo. Sería útil si solo desea obtener el último elemento de la matriz:

my $lastElement = $arr[$#arr];

Además, como puede ver aquí en , la mayoría de los resaltadores de sintaxis no manejan correctamente esta construcción ...


Hay varias formas de imprimir el tamaño de la matriz. Aquí están los significados de todos: Digamos que nuestra matriz es my @arr = (3,4);

Método 1: escalar

Esta es la forma correcta de obtener el tamaño de los arrays.

print scalar @arr; # prints size, here 2

Método 2: Número de índice

$#arr da el último índice de una matriz. así que si la matriz es de tamaño 10, entonces su último índice sería 9.

print $#arr; # prints 1, as last index is 1 print $#arr + 1; # Add 1 to last index to get array size

Estamos agregando 1 aquí considerando la matriz como 0-indexada . Pero, si no está basado en cero entonces, esta lógica fallará .

perl -le ''local $[ = 4; my @arr=(3,4); print $#arr + 1;'' # prints 6

El ejemplo anterior imprime 6, porque hemos establecido su índice inicial en 4. Ahora el índice sería 5 y 6, con los elementos 3 y 4 respectivamente.

Método 3:

Cuando se usa una matriz en un contexto escalar, devuelve el tamaño de la matriz

my $size = @arr; print $size; # prints size, here 2

En realidad, el método 3 y el método 1 son iguales.


La sección “Tipos de variables de Perl” de la documentación de perlintro contiene

La variable especial $#array le indica el índice del último elemento de una matriz:

print $mixed[$#mixed]; # last element, prints 1.23

Podría sentirse tentado a usar $#array + 1 para decirle cuántos elementos hay en una matriz. No te molestes A medida que sucede, el uso de @array donde Perl espera encontrar un valor escalar ("en contexto escalar") le dará el número de elementos en la matriz:

if (@animals < 5) { ... }

La documentación de perldata también cubre esto en la sección "Valores escalares" .

Si evalúa una matriz en un contexto escalar, devuelve la longitud de la matriz. (Tenga en cuenta que esto no es cierto para las listas, que devuelven el último valor, como el operador de coma C, ni para las funciones integradas, que devuelven lo que sienten que desean devolver). Lo siguiente siempre es cierto:

scalar(@whatever) == $#whatever + 1;

Algunos programadores eligen usar una conversión explícita para no dejar nada en duda:

$element_count = scalar(@whatever);

Anteriormente, en la misma sección se documenta cómo obtener el índice del último elemento de una matriz.

La longitud de una matriz es un valor escalar. Puede encontrar la duración del array @days evaluando $#days , como en csh . Sin embargo, esta no es la longitud de la matriz; es el subíndice del último elemento, que es un valor diferente, ya que normalmente hay un elemento 0.


La primera y la tercera son las mismas: evalúan una matriz en un contexto escalar. Consideraría que esta es la forma estándar de obtener el tamaño de una matriz.

La segunda forma en realidad devuelve el último índice de la matriz, que no es (generalmente) el mismo que el tamaño de la matriz.


Los tres dan el mismo resultado si modificamos el segundo un poco:

my @a = (undef, undef); my $size = @a; warn "Size: " . $#a; # Size: 1. It''s not the size warn "Size: " . $size; # Size: 2


Para encontrar el tamaño de una matriz, use la palabra clave scalar :

print scalar @array;

Para averiguar el último índice de una matriz, hay $# (variable predeterminada de Perl). Da el último índice de una matriz. Cuando una matriz comienza desde 0, obtenemos el tamaño de la matriz agregando uno a $# :

print "$#array+1";

Ejemplo:

my @a = qw(1 3 5); print scalar @a, "/n"; print $#a+1, "/n";

Salida:

3 3


Para usar la segunda forma, agrega 1:

my @arr = (2, 4, 8, 10); print "First result:/n"; print scalar @arr; print "/n/nSecond result:/n"; print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0. print "/n/nThird result:/n"; my $arrSize = @arr; print $arrSize;


Primero, el segundo no es equivalente a los otros dos. $#array devuelve el último índice de la matriz, que es uno menos que el tamaño de la matriz.

Los otros dos son virtualmente iguales. Simplemente estás utilizando dos medios diferentes para crear un contexto escalar. Se trata de una cuestión de legibilidad.

Personalmente prefiero lo siguiente:

say 0+@array; # Represent @array as a number

Me parece mas claro que

say scalar(@array); # Represent @array as a scalar

y

my $size = @array; say $size;

Este último se ve bastante claro solo así, pero me parece que la línea adicional quita claridad cuando forma parte de otro código. Es útil para enseñar lo que @array hace en el contexto escalar, y tal vez si desea usar $size más de una vez.