2016-05-05 10 views
1

Ich bin JSON-Parsing und die endgültige Hash, die ich von allen JSON-Datei erhalten .. die Funktion aufgerufen wird, übergeben Indexeinträge, die ich drucken muss. Wenn ich versuche, die Variable so zu setzen, wie sie ist, stirbt sie mit dem Fehler. Die auskommentierte Zeile ist, was ich versuche zu bekommen ... Der Grund für die Verwendung dieser Funktion ist, verschiedene Werte zu übergeben und jede Art von Kombination, die ich brauche.Perl übergeben 3D-Hash-Indizes als Strings

&Function('{value}{Agent}{macName}') 


sub Function(){ 
    my $key = $_[0]; 
    my $URL = "www.xyz.com"; 
    my $json = get($URL); 
    my $decoded_json = decode_json($json); 

    for (@{$decoded_json->{value}}) { 
     #print $_->{value}{Agent}{macName}."\n"; 
     print $_->$key."\n"; 

    } 
} 


Can't call method "{value}{Agent}{macName}" on unblessed reference at Json_Decoder.pl line 34. 

Wie kann ich auf diesen Eintrag zugreifen? Drucken Sie $ _-> {Wert} {Agent} {MacName} ... indem Sie das Argument '{Wert} {Agent} {MacName}' dieser Funktion verwenden.

Antwort

2

Verwendung Data::Diver, macht es möglich, einen „Weg“ von Hash-Schlüssel als Liste angeben:

#!/usr/bin/perl 
use warnings; 
use strict; 

use Data::Diver qw{ Dive }; 

sub Function { 
    my $key = shift; 
    my $decoded_json = { value => { Agent => { macName => 'name' } } }; 
    my @path = split /\}\{/, $key; 
    $path[-1] =~ s/\}$//; 
    $path[0] =~ s/^\{//; 

    print Dive($decoded_json, @path), "\n"; 
} 


Function('{value}{Agent}{macName}'); 

Beachten Sie auch, dass Sie die & brauchen nicht die Funktion aufzurufen, und dass die leere Prototyp () ist falsch in Ihrem Code (aber ignoriert, da die Funktion "vor" es heißt) aufgerufen wird. Details siehe perlsub.