2012-09-07 22 views
6

Sólo estoy tratando de aprender un poco de Perl y he encontrado esto:operadores consecutivos y los soportes

foreach $element (@{$records}) 
{ 
    do something; 
} 

A mis ojos novato, esto se lee: "para cada elemento de un conjunto llamado {@ $ records}, haga algo " pero, dado que parece un nombre poco probable para una matriz (con" @{$ "en total), me imagino que no es tan simple?

También he encontrado "%$" usados ​​juntos. Sé % significa un hash y $ significa un escalar pero no sé lo que significan juntos.

¿Alguien puede arrojar alguna luz sobre esto?

Respuesta

10

En Perl se puede tener una referencia (un puntero) a una estructura de datos:

# an array 
my @array; 

# a reference to an array 
my $ref = \@array; 

Cuando se tiene una referencia para poder uso la matriz que necesita desreferenciar que

@{ $ref } 

Si necesita acceder a un elemento como en

$array[0] 

puede hacer lo mismo con una referencia

${$ref}[0] 

Las llaves son opcionales {} y también puede usar

$$ref[0] 
@$ref 

pero personalmente los encuentro menos legibles.

Lo mismo se aplica a cualquier otro tipo (como %$ para una referencia hash).

Consulte man perlref para los detalles y man perlreftut para obtener un tutorial.

Editar

La flecha operador -> también se puede utilizar para eliminar la referencia de un array o un hash

$array_ref->[0] 

o

$hash_ref->{key} 

Ver man perlop para más detalles

+4

prefiero acceder a un solo elemento en una matriz de referencia con '$ array -> [0]' –

+1

@LeonardoHerrera Gracias (lo olvidé por completo, pero vale la pena mencionarlo ya que es ampliamente utilizado especialmente con hashes). Actualicé la respuesta. – Matteo

+1

3 o son 4 formas de obtener un elemento de matriz cuando se le da una referencia de matriz. Me pregunto cuántos hay en Perl 6? 3 maneras se ponen un poco confusas. – Scooter

3

Si usted tiene una referencia a un array o un hash, se utilizaría un escalar para mantener la referencia:

my $href = \%hash; 
my $aref = \@array; 

Cuando se quiere de-reference estas referencias, se utiliza el símbolo apropiado para el tipo de referencia:

for my $element (@$aref) { 
} 

for my $key (keys %$href) { 
} 
Cuestiones relacionadas