Editar: Hash frente matriz
Como cincodenada señaló correctamente en el comentario, ysth dio una mejor respuesta: Debería haber respondido a su pregunta con otra pregunta: "¿Realmente desea utilizar una matriz de Perl ? Un hash puede ser más apropiado ".
Una matriz asigna memoria para todos los índices posibles hasta la más grande usada hasta ahora. En su ejemplo, asigna 24 celdas (pero usa solo 3). Por el contrario, un hash solo asigna espacio para los campos que realmente se usan.
solución de matriz: grep escalar
Aquí hay dos soluciones posibles (ver más abajo para una explicación):
print scalar(grep {defined $_} @a), "\n"; # prints 3
print scalar(grep $_, @a), "\n"; # prints 3
Explicación: Después de añadir $a[23]
, su matriz contiene realmente 24 elementos --- pero la mayoría de ellos no están definidos (lo que también se evalúa como falso). Puede contar la cantidad de elementos definidos (como se hizo en la primera solución) o la cantidad de elementos verdaderos (segunda solución).
¿Cuál es la diferencia? Si configura $a[10]=0
, la primera solución contará, pero la segunda no (porque 0 es falso pero está definido). Si configura $a[3]=undef
, ninguna de las soluciones lo contará.
solución hash (por yst)
Como sugiere otra solución, se puede trabajar con un hash y evitar todos los problemas:
$a{0} = 1;
$a{5} = 2;
$a{23} = 3;
print scalar(keys %a), "\n"; # prints 3
Esta solución cuenta con ceros y valores undef.
Intentaré hash, gracias. – grilix
La última parte de esta respuesta es la correcta. Grillix parece ser de un fondo de PHP. Lo que PHP llama "arreglos" en realidad son más parecidos a los valores hash de Perl, y el último debería usarse en casos como este. – cincodenada
¿Cómo se puede extender esta idea a matrices multidimensionales en perl? – damned