print - Inicialización de matriz en Perl
print array perl (3)
¿Cómo inicializo una matriz a 0?
He intentado esto.
my @arr = ();
Pero siempre me lanza una advertencia, "Uso de valor no inicializado" . No sé el tamaño de la matriz de antemano. Lo lleno dinámicamente. Pensé que el código anterior debía inicializarlo a 0.
¿Cómo hago esto?
¿Qué quiere decir con "inicializar una matriz a cero"? Las matrices no contienen "cero", pueden contener "cero elementos", que es lo mismo que "una lista vacía". O, podría tener una matriz con un elemento, donde ese elemento es un cero: my @array = (0);
my @array = ();
debería funcionar bien: asigna una nueva matriz llamada @array
, y luego le asigna la lista vacía, ()
. Tenga en cuenta que esto es idéntico a decir simplemente my @array;
, ya que el valor inicial de una nueva matriz es la lista vacía de todos modos.
¿Está seguro de que está obteniendo un error de esta línea y no de otro lugar en su código? Asegúrese de tener un use strict; use warnings;
use strict; use warnings;
en su módulo o script, y verifique el número de línea del error que recibe. (La publicación de un código contextual aquí también podría ayudar).
Para producir la salida en tu comentario a tu publicación, esto lo hará:
use strict;
use warnings;
my @other_array = (0,0,0,1,2,2,3,3,3,4);
my @array;
my %uniqs;
$uniqs{$_}++ for @other_array;
foreach (keys %uniqs) { $array[$_]=$uniqs{$_} }
print "array[$_] = $array[$_]/n" for (0..$#array);
Salida:
array[0] = 3
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 1
Esto es diferente al algoritmo establecido para producir una matriz paralela con valores cero, pero es una forma más perly de hacerlo ...
Si debe tener una matriz paralela que tenga el mismo tamaño que la primera matriz con los elementos inicializados a 0, esta declaración lo hará dinámicamente: @array=(0) x scalar(@other_array);
Pero en realidad, no necesitas hacer eso.
Si te entiendo, tal vez no necesites un conjunto de ceros; más bien, necesitas un hash . Las claves de hash serán los valores en la otra matriz y los valores de hash serán el número de veces que exista el valor en la otra matriz:
use strict;
use warnings;
my @other_array = (0,0,0,1,2,2,3,3,3,4);
my %tallies;
$tallies{$_} ++ for @other_array;
print "$_ => $tallies{$_}/n" for sort {$a <=> $b} keys %tallies;
Salida:
0 => 3
1 => 1
2 => 2
3 => 3
4 => 1
Para responder a su pregunta específica de manera más directa, para crear una matriz rellena con un grupo de ceros, puede usar la técnica en estos dos ejemplos:
my @zeroes = (0) x 5; # (0,0,0,0,0)
my @zeroes = (0) x @other_array; # A zero for each item in @other_array.
# This works because in scalar context
# an array evaluates to its size.