2010-07-11 12 views
9
%data = (
    'digits' => [1, 2, 3], 
    'letters' => ['a', 'b', 'c'] 
); 

¿Cómo puedo push'4' en $data{'digits'}?¿Cómo puedo insertar un elemento en una referencia de matriz como valor hash?

Soy nuevo en Perl. Esos símbolos $, @, % me parecen raros; Vengo de un fondo de PHP.

+1

Ver [perldoc perldata] (http://perldoc.perl.org/perldata.html) y [perldoc perldsc] (http://perldoc.perl.org/perldsc.html) para obtener información sobre Perl estructuras de datos. – Ether

Respuesta

13
push @{ $data{'digits'} }, 4; 

$ data {'digits'} devuelve una matriz-referencia. Coloca @ {} a su alrededor para "desreferenciarlo". Del mismo modo,% {} desreferenciará una referencia hash y $ {} una referencia escalar.

Si tiene que poner algo en una referencia a un hash, es decir

$hashref = { "foo" => "bar" } 

Puede utilizar cualquiera:

${ $hashref }{ "foo2" } = "bar2" 

o la flecha de la notación:

$hashref->{"foo2"} = "bar2" 

En una de cierta manera, piense en una referencia como lo mismo que el nombre de la variable:

push @{ $arrayref }, 4 
push @{ "arrayname" }, 4 
push @arrayname , 4 

De hecho, eso es lo que son "referencias suaves". Si usted no tiene todas las strictnesses encendidos, puede literalmente:

# perl -de 0 
    DB<1> @a=(1,2,3) 
    DB<2> $name="a" 
    DB<3> push @{$name}, 4 
    DB<4> p @a 
1234 
+2

Una referencia no dura es una referencia simbólica. – ysth

2
push @{data{'digits'}}, 4; 

El @ {} hace una matriz a partir de una referencia (data{'digits'} devuelve una referencia a un array.) A continuación, utilizamos la matriz que tiene que empujar el valor 4 en la matriz en el hash.

Esto link ayuda a explicarlo un poco.

Utilizo este link para cualquier pregunta sobre hashes en Perl.

1
push @{ $data{digits} }, 4; 

La página web oficial documentación de Perl tiene un buen tutorial sobre estructuras de datos: perldsc, en particular la sección Hashes-of-Arrays.

$, @ y% se conocen como sigils.

2

Para una opción exótica pero muy agradable a simple vista eche un vistazo al módulo CPAN autobox::Core.

use autobox::Core; 

my %data = (
    digits => [1, 2, 3], 
    letters => ['a', 'b', 'c'], 
); 

$data{digits}->push(4); 

$data{digits}->say; # => 1 2 3 4 
Cuestiones relacionadas