2016-04-28 75 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加載?