将散列引用作为参数传递给perl脚本中的perl脚本

Har*_*itz 1 perl hash reference

我想将一个哈希引用作为参数从一个perl脚本(script1.pl)传递给另一个perl脚本(script2.pl).这是我的代码的样子:

---------------------------- script1.pl ------------------- --------------

#!/usr/bin/perl -w

use strict;
use warnings;

my %hash = (
'a'      => "Harsha",
'b'      => "Manager"
);

my $ref = \%hash;

system "perl script2.pl $ref";
Run Code Online (Sandbox Code Playgroud)

---------------------------- script2.pl ------------------- --------------

#!/usr/bin/perl -w

use strict;
use warnings;

my %hash = %{$ARGV[0]};

my $string = "a";

if (exists($hash{$string})){
    print "$string = $hash{$string}\n";
}
Run Code Online (Sandbox Code Playgroud)

这是输出错误:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `perl script2.pl HASH(0x8fbed0)'
Run Code Online (Sandbox Code Playgroud)

我无法找出传递参考的正确方法.

Sob*_*que 8

散列是内存数据结构.进程'拥有'自己的内存空间,而其他进程不能只访问它.如果你考虑一下,我相信你会很快发现原因.

哈希引用是该内存位置的地址.即使其他进程可以"理解"它,它仍然无法访问内存空间.

我们在这里谈论的实际上是一个相当大的概念 - 进程间通信或IPC - 因此有关于它的文档的整整一章,称为perlipc.

它的长短是 - 你无法做你想做的事.在进程之间共享内存比你想象的要困难得多.

您可以做的是来回传输数据 - 不是通过引用,而是包含实际信息.

我建议,对于您的示例,该作业的工具是JSON,因为您可以编码和解码您的哈希:

#!/usr/bin/perl -w

use strict;
use warnings;

use JSON;

my %hash = (
    'a' => "Harsha",
    'b' => "Manager"
);

my $json_string = to_json( \%hash );

print $json_string;
Run Code Online (Sandbox Code Playgroud)

这给出了:

{"b":"Manager","a":"Harsha"}
Run Code Online (Sandbox Code Playgroud)

然后你可以'传递'你的$json_string- 在命令行上,但要记住,@ARGV如果你不小心 - 或通过,它中的任何空格都会混淆STDIN.

然后在您的子流程中解码:

use strict;
use warnings;

use JSON;

my $json_string = '{"b":"Manager","a":"Harsha"}';

my $json = from_json ( $json_string );

my $string = "a";

if (exists($json -> {$string} )){
    print "$string = ",$json -> {$string},"\n";
}
Run Code Online (Sandbox Code Playgroud)

(您可以通过执行以下操作使其与代码更相似:

my $json = from_json ( $json_string );
my %hash = %$json;
Run Code Online (Sandbox Code Playgroud)

其他选择是:

  • 使用Storable- 冷冻和解冻(内存)或存储和检索(磁盘)
  • 使用IPC::Open2和发送数据STDIN.

真的有很多选择 - 看一看perlipc.但不幸的是,这并不像"仅仅传递参考"那么简单.