我有这种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对象发送到一个PerlCGI脚本,在那里我将其转换为散列的散列。
现在,我想使用命令行参数将这个散列引用发送到另一个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的新手。
您应该以JSON的形式发送数据。IPC::Open3可能是一个不错的选择:
$pid = open3(*CHLD_IN, *CHLD_OUT, *CHLD_ERR,
'perl te.pl');
print CHLD_IN $r;
close CHLD_IN;
您仍然可以从CHLD_OUT
读取结果,而不是使用倒勾号。
在te.pl:内
{
local $/ = undef;
my $json = <STDIN>;
}
使用{ ... }
块将$/
的修改限制为该操作。
但是为什么需要调用外部脚本呢?为什么不通过require
加载它或将所需的功能移动到模块?
您的哈希是嵌套的。通过打印它,你只需要得到reftype和地址,所以你调用这个命令:
perl te.pl key HASH(0x2886cd0)
失败的原因是括号对于shell来说是特殊的。
我宁愿通过文件或管道将JSON发送到脚本。