¿Qué sucede con un hash perl cuando lo encierro entre llaves?

Estoy tratando de entender cómo funciona este módulo perl, se llama XML::Smart. La mayor parte fue fácil de entender excepto por una cosa que no está tan relacionada con el módulo.

Lo que quiero hacer es copiar un hash de mi secuencia de comandos en el módulo XML::Smart para su procesamiento. Después de un poco de "prohibición" logré que hiciera lo que quería. El problema es que no sé qué hice exactamente. Si alguien pudiera dar una pista de por qué funciona esto, qué significa en inglés, sería genial.

Vi algo como esto cuando estaba jugando con mis propios módulos, lo que significa que tenía algo que ver con hacer una clase, no estoy seguro de si así se llamaba o si tiene algo similar.

Aquí está mi código;

#!/usr/bin/perl
use strict;
use warnings;
use XML::Smart;

my $xml_obj = XML::Smart->new();

my %config_file = (
    "server01" => {
        "connection" => {
            "address" => "10.0.0.4",
            "port" => "22",
        }, "authentication" => {
            "username" => "admin",
            "password" => "password",
        },
    },
);

$xml_obj->{config} = {%config_file};

preguntado el 12 de junio de 12 a las 20:06

2 Respuestas

Crea una referencia a un nuevo hash con una copia (superficial) del antiguo hash.

{} es un hashref.

{ "foo", "bar", "x", "y" } define un hashref con una lista de claves y valores.

Si pones un hachís dentro {} está en contexto de lista, por lo que se convierte en una lista de claves y valores.

Respondido el 12 de junio de 12 a las 20:06

@Solignis: no, eso sería una referencia al hash original, no una copia del mismo. - Quentin

Lo que estoy tratando de hacer no es tanto copiar (mala elección de palabras), quiero "reflejar el hash original en $xml_obj->{config}. ¿Tiene sentido? - ianc1215

Realmente no; "reflejar" no es un término definido. Tu puedes hacer $xml_obj->{config} = \%config_file;, pero no es lo mismo. Cambiando %config_file y cambiando %{ $xml_obj->{config} } cambia el mismo hash, por lo que ambos verán el cambio. Si está bien, puedes usar $xml_obj->{config} = \%config_file;. Si eso no está bien, quieres { %config_file } o algo que crea una copia más profunda (como Storable's dclone). - Ikegami

Sí, el primer ejemplo que mencionaste es lo que estoy buscando hacer al menos por ahora. Ok, creo que lo entendí, ¡gracias! - ianc1215

Si está tratando de asignar %config_file a $xml_obj->{config}, querrá hacer algo como un trozo de hash.

@{ $xml_obj->{config} }{ claves %config_file } = valores %config_file;

Respondido el 12 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.