2012-10-01 17 views
6

Los términos Perl me confunden y no es mi lengua materna, así que tengan paciencia conmigo. Trataré de usar los términos correctos, pero daré un ejemplo solo para estar seguro.¿Por qué Perl no me permite desreferenciar un miembro de una referencia hash en una matriz?

Tengo una referencia hash en la variable $ foo. Digamos que $ foo -> {'bar'} -> {'baz'} es una referencia de matriz. Es decir, puedo obtener el primer miembro de la matriz asignando $ foo -> {'bar'} -> {'baz'} -> [0] a un escalar.

cuando hago esto:

foreach (@$foo->{'bar'}->{'baz'}) 
{ 
    #some code that deals with $_ 
} 

me sale el error "No es una referencia a un array en la línea 41 script.pl"

Pero cuando hago esto funciona:

$myarr = $foo->{'bar'}->{'baz'}; 
foreach (@$myarr) 
{ 
    #some code that deals with $_ 
} 

¿Hay algo que no entiendo? ¿Hay alguna manera de que pueda obtener el primer ejemplo para trabajar? Probé envolviendo la expresión entre paréntesis con el @ en el exterior, pero eso no funcionó. Gracias de antemano por la ayuda.

+0

El analizador tiene que entender lo que quieres decir, y la sintaxis que intentas al principio va cosas que quieres desreferenciar @ $ foo, que no puedes en tu caso. Se trata de cómo diferentes tokens se unen a las cosas que los rodean. Tenemos una explicación más larga en _Intermediate Perl_. :) –

Respuesta

11
$myarr = $foo->{'bar'}->{'baz'}; 
foreach (@$myarr) 
{ 
    #some code that deals with $_ 
} 

Si reemplaza el $myarr en bucle con su lado derecho, que parece: -

foreach (@{$foo->{'bar'}->{'baz'}}) 
{ 
    #some code that deals with $_ 
} 
+0

Para cualquier otra persona que tropiece con esto, la clave de esta respuesta son las llaves que encierran toda la expresión. Me gustaría poder marcar dos respuestas porque la explicación sobre el tema de precedencia también es muy útil. –

+4

@JasonThompson Entonces, ¿por qué no marca la respuesta con la explicación correcta? – TLP

+0

¿Por qué un voto negativo en una respuesta aceptada? ¿Puede el infractor dejar un comentario aquí? –

3

que debe ser similar

foreach (@{$foo->{'bar'}->{'baz'}}) 
{ 
    #some code that deals with $_ 
} 
14

Es sólo una cuestión de preferencia.

@$foo->{'bar'}->{'baz'} 

significa

((@{ $foo })->{'bar'})->{'baz'} 

$foo no contiene una referencia de matriz, por lo tanto el error. No obtiene el problema de precedencia si no omite los curlies opcionales alrededor de la expresión de referencia.

@{ $foo->{'bar'}->{'baz'} } 
Cuestiones relacionadas