Имам такива данни в JSON формат
{
"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"
}
}
Изпратих този JSON обект на Perl CGI скрипт, където го преобразувах в хеш от хешове.
Сега искам да изпратя тази препратка към друг скрипт на Perl с аргумент от команден ред. Не знам защо не работи.
Тук е моят CGI скрипт
#!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);
}
Когато печатам %h1
Не получавам желания резултат.
Моля да ме уведомите как точно да поправя това, защото съм нов в Perl и CGI.
Отговори:
2 за отговор № 1Трябва да изпратите данните като JSON. IPC :: Open3 може да е добър избор:
$pid = open3(*CHLD_IN, *CHLD_OUT, *CHLD_ERR,
"perl te.pl");
print CHLD_IN $r;
close CHLD_IN;
Все още можете да прочетете резултата от CHLD_OUT
вместо да използват backticks.
В рамките на te.pl:
{
local $/ = undef;
my $json = <STDIN>;
}
Използвай { ... }
блок за ограничаване на модификацията на $/
за тази операция.
... но защо трябва да се обадите на външен скрипт? Защо не го зареждате чрез require
или преместване на необходимите функции в модул?
1 за отговор № 2
Вашият хеш е вложен. Като я отпечатате, получавате само reftype и адреса, така че наричате тази команда:
perl te.pl key HASH(0x2886cd0)
Които не успяват като скоби са специални за черупката.
По-скоро бих изпратил JSON на скрипта, може би чрез файл или тръба.