2012-04-20 14 views
15

Recientemente comencé a aprender Perl y tengo una pregunta que no encuentro una respuesta clara en Internet. decir que tengo algo como esto,Formas de aplanar una matriz Perl en el contexto escalar

@arr = (1, 2, 3); 
$scal = "@arr" 
# $scal is now 123. 

¿Es el uso de comillas la única manera de aplanar la matriz de modo que cada elemento se almacena en el valor escalar? Parece improbable, pero no he encontrado ninguna otra forma de hacerlo. Gracias por adelantado.

Respuesta

32

La función join se usa comúnmente para "aplanar" las listas. Le permite especificar lo que quiere entre cada elemento en la cadena resultante.

$scal = join(",", @arr); 
# $scal is no "1,2,3" 
+0

¿Qué pasaría si quisieras descartar todo menos el primer elemento de la matriz, pero sin tener que almacenar primero la matriz en una variable? –

+0

@AlexejMagura: no tiene sentido en el contexto de esta pregunta.Si solo quieres el primer elemento en una matriz, solo tómalo. Aplanar solo un escalar no es muy útil. – Mat

5

También puede utilizar sin ningún tipo de separador join

my $scalar = join('' , @array) ; 

Hay más de una manera de hacerlo.

+0

Pedante, eso no es usar 'join()' sin un separador, está usando 'join()' con una cadena vacía como el separador :-) –

-2

Lee section Context in perldata. Perl tiene dos contextos principales: escalar y lista.

Por ejemplo:

@a = (1, 1, 1); # list context 
print @a;   # list context 
$count = @a;  # scalar context, returns the number of elements in @a 

etc.

+2

Esto no tiene nada que ver con * aplanamiento * una matriz. – Borodin

4

en el espíritu de TIMTOWTDI:

my $scal; 
$scal .= $_ foreach @arr; 
13

En su ejemplo, que estás interpolando una matriz en una cadena entre comillas dobles. Lo que ocurre en esas circunstancias está controlado por la variable $" de Perl. De perldoc perlvar:

$ LIST_SEPARATOR

$"

Cuando una matriz o una rodaja de matriz se interpola en una cadena entre comillas dobles o un contexto similar, como /.../, sus elementos están separados por este valor predeterminado es un espacio por ejemplo, esto:..

print "The array is: @array\n";

es equivalente a esto:

print "The array is: " . join($", @array) . "\n";

mnemotécnico: trabaja en contexto entre comillas dobles.

El valor predeterminado para $" es un espacio. Obviamente, puede cambiar el valor de $".

{ 
    local $" = ':', 
    my @arr = (1, 2, 3); 
    my $scalar = "@arr"; # $scalar contains '1:2:3' 
} 

Como con cualquiera de las variables especiales de Perl, siempre es mejor localizar cualquier cambio dentro de un bloque de código.

+0

Lanza una advertencia si algún valor en la matriz es 'undef'. ¿Como resolverlo? –

+0

Depende de lo que quiera hacer. Puedo pensar en tres alternativas obvias. 1/Ignore las advertencias. 2/Use 'grep' en la matriz para eliminar los elementos indefinidos. 3/Use 'map' en la matriz para convertir elementos indefinidos a algún otro valor (quizás una cadena vacía). Si necesita más detalles, probablemente debería hacer una nueva pregunta. –

Cuestiones relacionadas