J'ai un tableau de hachage comme celui-ci:

[
    {
        'id'    => '6',
        'image' => '/x/eng/rlse/DOT/R9.0xN/final/bedrock/export/x86_64/tarball/image.tgz'
    },
    {
        'new_netboot_image' => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/final/bedrock/export/x86_64/netboot/netboot/kernel',
        'version'           => '9.2',
        'ntest'             => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/test/nate/bin/ntest',
        'nate_lib'          => '/x/eng/ctl/test-tools;/x/eng/ctl/test-tools/
    }
];

Je veux transmettre cela à un sous-programme qui n'accepte que les références de hachage. Comment puis-je faire cela? La sortie ci-dessus provient du dumper suivant.

$Log->info("Dumping array after updating" . Dumper($orig_cleanup_version_settings));
        $Api->service_db->cleanup_version_mapping_update($orig_cleanup_version_settings);
-3
Phoenix 23 mai 2018 à 15:31

3 réponses

Meilleure réponse

Voici une approche qui crée une référence de hachage basée sur vos spécifications. Mon élément transaction spécule sans fondement qu'il est identique à id dans l'entrée.

#!/usr/bin/env perl

use Modern::Perl;
use Data::Dumper;

my $a = [
    {
        'id'    => '6',
        'image' => '/x/eng/rlse/DOT/R9.0xN/final/bedrock/export/x86_64/tarball/image.tgz'
    },
    {
        'new_netboot_image' => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/final/bedrock/export/x86_64/netboot/netboot/kernel',
        'version'           => '9.2',
        'ntest'             => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/test/nate/bin/ntest',
        'nate_lib'          => '/x/eng/ctl/test-tools;/x/eng/ctl/test-tools/'
    }
];

my $h = { map { %$_ } @$a };
$h->{ transaction } = delete $h->{ id };
print Dumper $h;

Production:

$VAR1 = {
          'image' => '/x/eng/rlse/DOT/R9.0xN/final/bedrock/export/x86_64/tarball/image.tgz',
          'new_netboot_image' => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/final/bedrock/export/x86_64/netboot/netboot/kernel',
          'version' => '9.2',
          'ntest' => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/test/nate/bin/ntest',
          'nate_lib' => '/x/eng/ctl/test-tools;/x/eng/ctl/test-tools/',
          'transaction' => '6'
        };
1
mr_ron 23 mai 2018 à 14:18

Utilisez ref () pour tester la valeur passée. Dans l'exemple suivant, nous passons un hachage et deux refs de hachage, notez que nous n'imprimons les valeurs que deux fois, même si trois hachages ont été passés (deux en tant que refs). Les chaînes: "HASH" "ARRAY" "SCALAR" peuvent être utilisées pour tester des références à des structures, et la chaîne de package d'une classe telle que "Foo :: Bar" peut être utilisée pour tester des objets.

#! /bin/perl

use strict ; 

my %foo = ('foo' => 'bar') ; # hash
my $reffoo = \%foo ; # hashref
my $refbar = {'bar' => 'foo'} ; # hashref

sub only_hashref {
    return undef unless (ref($_[0]) eq 'HASH') ; 
    print ($_[0]->{'foo'}, "\n") if defined $_[0]->{'foo'} ; 
    print ($_[0]->{'bar'}, "\n") if defined $_[0]->{'bar'} ; 
}

only_hashref(%foo) ; 
only_hashref($reffoo) ; 
only_hashref($refbar) ; 
0
James Aanderson 23 mai 2018 à 14:10

Il semble que vous deviez regrouper les hachages du tableau en un seul hachage

À une supposition, la structure de données a été construite de manière incorrecte, ce qui entraîne deux hachages au lieu d'un. Le meilleur moyen serait de créer correctement le hachage en premier lieu, mais ce code combinera les données pour vous

my $data = [
    {
        'id'    => '6',
        'image' => '/x/eng/rlse/DOT/R9.0xN/final/bedrock/export/x86_64/tarball/image.tgz'
    },
    {
        'new_netboot_image' => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/final/bedrock/export/x86_64/netboot/netboot/kernel',
        'version'           => '9.2',
        'ntest'             => '/x/eng/bbnbs/daemon/DOT/R9.2x/cit-ok/test/nate/bin/ntest',
        'nate_lib'          => '/x/eng/ctl/test-tools;/x/eng/ctl/test-tools/
    }
];

my %params;
{
    %params = ( %params, %$_ ) for values %$data;
}

my_sub(\%params);
1
Borodin 23 mai 2018 à 14:10