2016-04-28 69 views
1

予有这种数据的JSON格式经由命令行参数发送散列的散列从一个Perl CGI程序到另一个Perl脚本

{ 
    "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/html\n\n"; 
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 sample\n"); 

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

当我打印%h1我没有得到期望的输出。

请让我知道如何正确解决这个问题,因为我是Perl和CGI的新手。

+0

@mkHun:之前我问过你不要对其他人的帖子进行微小的修改。如果你有一个重大的改变,那么修正一个小写字母就可以了,但是它太过于微不足道了。 – Borodin

+0

我不知道你在做什么,但它*值得一看** redis **作为数据结构服务器... http://stackoverflow.com/a/18227177/2836621只是一个想法。 –

+0

@MarkSetchell我只需要将这个散列传递给另一个perl脚本,作为命令行参数进一步处理 –

回答

1

你的散列是嵌套的。通过打印出来,你刚才得到的RefType的和地址,所以你调用该命令:

perl te.pl key HASH(0x2886cd0) 

如括号特供其壳失败。

我宁愿发送JSON到脚本,也许通过文件或管道。

2

您应该将数据作为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>; 
} 

使用{ ... }块的$/修改限制该操作。

...但为什么你需要调用一个外部脚本?为什么不通过requiremoving the required functions to a module加载?

相关问题