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)
我无法找出传递参考的正确方法.
散列是内存数据结构.进程'拥有'自己的内存空间,而其他进程不能只访问它.如果你考虑一下,我相信你会很快发现原因.
哈希引用是该内存位置的地址.即使其他进程可以"理解"它,它仍然无法访问内存空间.
我们在这里谈论的实际上是一个相当大的概念 - 进程间通信或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.但不幸的是,这并不像"仅仅传递参考"那么简单.