2012-08-09 5 views
6
$a = {b=>{c=>1}}; # set up ref 
$b = $a->{b};  # ref the ref 
$b .= (d=>1,e=>1); # where we want to assign multiple key/val at once 

Al final de la misma $a debe verse como:Perl: cómo empujar clave/valor par en hashref y aún conservan referencia

  • { 
        'b' => { 
          'c' => 1, 
          'd' => 1, 
          'e' => 1 
         } 
    }; 
    

Al final de la misma $b debería verse como:

  • { 
        'c' => 1, 
        'd' => 1, 
        'e' => 1 
    } 
    

Nota: sería lo mismo que hacer:

$b->{d} = 1; 
$b->{e} = 1; 

$b = { %$b, d=>1, e=>1 }; no se desea, ya que crea una copia de $a y pierde la referencia.

Respuesta

8
%{$b} = (d => 1, e => 1); 

Simplemente des-referencia el hash-ref anónimo para que parezca un hash al operador de asignación.

Incluso se puede hacer esto:

%{$b} = (%{$b}, d => 1, e => 1); 

En estos casos %{$b} es realmente una mayor comodidad visual (aunque en algunos casos puede ser un desambiguación sintáctica) para %$b.

... o usted podría hacer ...

foreach (qw/ d e /) { 
    $b->{$_} = 1; 
} 

Obviamente probablemente no estás con la intención de asignar el valor de '1' a todo. Entonces, ¿cómo sobre una rebanada:

@{$b}{ qw/ d e/} = (1, 1); 

Los sectores se discuten en perldoc perldata, pero no hay realmente una buena descripción perldoc de tomar una rebanada de un hash anónimo. Para eso, debe llegar a un acuerdo con toda la documentación de Perl sobre referencias, y luego extrapolar cómo aplicar eso a la sintaxis de corte. ... o marque anonymous hash slices en PerlMonks.

+0

Sí, miré perldata antes de preguntar y no pude encontrar nada específico. Me alegro de que haya podido descifrar algo de él. Francamente, estoy sorprendido '% {$ b} = (% {$ b}, d => 1, e => 1);' trabajado (que todavía aplica cambios a la referencia '$ a') – vol7ron

+0

El bit sobre la rebanada de hashref me ayudó a darme cuenta de que '->' no es necesario. Con '$ _' siendo un hashref, probé' @ _-> {qw (key1 key2)} 'que produce un mensaje de error críptico:' No se puede usar un valor indefinido como referencia HASH' Esto funciona: '@ { $ _} {qw (clave1 clave2)} ' – Palec

+0

@Palec Esto puede no tener ninguna relación con lo que estaba haciendo, pero en sus ejemplos' @ _' y '@ $ _' tienen dos significados diferentes – vol7ron

7

Usa la notación de división hash.

@$b{"d","e"} = (1,1); 

%newdata = (d => 1, e => 1); 
@$b{keys %newdata} = values %newdata; 
+0

+1, Ahh hash slices, por supuesto. Ambas respuestas fueron las que necesitaba: seleccioné las de David porque mantuve las llaves/valores juntas durante la asignación, todo en una línea. - Gracias, mafia – vol7ron

Cuestiones relacionadas