/ / Senden eines Hash-Hashes aus einem Perl-CGI-Programm an ein anderes Perl-Skript über ein Befehlszeilenargument - json, perl, hash, cgi

Senden eines Hash-Hashes von einem Perl-CGI-Programm über ein Befehlszeilenargument an ein anderes Perl-Skript - json, perl, hash, cgi

Ich habe diese Art von Daten im JSON-Format

 {
"stream 8": {
"stream_name": "xyz",
"field1": "xe-0/0/1",
"field2": "at-0/0/0"
},
"stream 12": {
"stream_name": "abc",
"field1": "br-0/1/1",
"field2": "at-1/0/1"
}
}

Ich habe dieses JSON-Objekt an ein Perl-CGI-Skript gesendet, wo ich es in einen Hash-Hash konvertiert habe.

Jetzt möchte ich diese Hashreferenz mit einem Befehlszeilenargument an ein anderes Perl-Skript senden. Ich weiß nicht, warum es nicht funktioniert.

Hier ist mein CGI-Skript

#!c:/perl/bin/perl.exe

use CGI;

use strict;
use warnings;

use JSON;
use JSON::PP;
use Data::Dumper;
use Storable;

# read the CGI params
my $q    = CGI->new;
my $json = $q->param("r");
print "Content-type:text/htmlnn";
my $href = decode_json($json);

my %arr = %{$href};

my %hash;
foreach my $key (keys %arr) {

my %a = %{$arr{$key}};
foreach my $value (keys %a) {

$hash{$key}{"streamname"} = $a{"stream_name"};
$hash{$key}{"f1"} =  $a{"field1"};
$hash{$key}{"f2"} = $a{"field2"};

}
}

my @h = %hash;
#print ref(@h);
print Dumper(@h);
my $out;
$out = `perl te.pl @h hashval`;

Te.pl

use strict;
use warnings;

use Data::Dumper;
use Storable;

print("nIn samplen");

if ( $ARGV[-1] eq "hashval" ) {
#print("nIts hashn");
delete($ARGV[-1]);
my %h1 = @ARGV;
print Dumper(%h1);
}

Wenn ich drucke %h1 Ich bekomme nicht die gewünschte Ausgabe.

Bitte lassen Sie mich wissen, wie ich das genau beheben kann, da ich neu bei Perl und CGI bin.

Antworten:

2 für die Antwort № 1

Sie sollten die Daten als JSON senden. IPC :: Open3 könnte eine gute Wahl sein:

$pid = open3(*CHLD_IN, *CHLD_OUT, *CHLD_ERR,
"perl te.pl");
print CHLD_IN $r;
close CHLD_IN;

Sie können das Ergebnis trotzdem lesen CHLD_OUT anstelle von Backticks.

Innerhalb von te.pl:

{
local $/ = undef;
my $json = <STDIN>;
}

Benutze die { ... } Block, um die Modifikation von zu begrenzen $/ zu dieser Operation.

... aber warum müssen Sie ein externes Skript aufrufen? Warum laden Sie es nicht über require oder Verschieben der benötigten Funktionen in ein Modul?


1 für die Antwort № 2

Ihr Hash ist verschachtelt. Wenn Sie es drucken, erhalten Sie nur den Namen und die Adresse, so dass Sie diesen Befehl aufrufen:

perl te.pl key HASH(0x2886cd0)

Was als Klammern ausfällt, ist speziell für die Shell.

Ich sende lieber die JSON an das Skript, vielleicht über eine Datei oder Pipe.