Perl 中hash_ref 传递问题,从一个程序传到另一个perl程序的问题
现有一个监听程序,不定期会接收到数据,格式如下,但考虑到数据连续传入(数据量大),而每一组数据处理时间约为5分钟,这样如果同时有10组数据送到监听程序,那需要50分钟方可处理完,同时会不会有数据积压等待甚至溢出现象发生, 所以现打算用如下方案进行处理,以保证主监听程序不会crash。
################################################################
方案1). 将接收到数据后即将其传递到另一个程序运行,但传递过程中出问题了。
程序如下:
print Dumper ($hash_ref);
显示结果如下:
$VAR1 = {
'4' => 'd',
'1' => 'a',
'3' => 'c',
'2' => 'b'
};
但把这个$hash_ref 传递到另一个程序时,出现问题。
my $cmd = "/usr/home/cel/try.pl $hash_ref";
system ( "/usr/bin/gnome/-terminal -e '$cmd' "); # 新开一个窗口,执行命令
/usr/home/cel/try.pl 的程序如下:
#!/usr/bin/perl -w
use Data::Dumper;
use strict;
my ($rec,) = @_;
print Dumper ($rec);
预期打印结果:
如上面显示。
实际打印结果:
$VAR1 = undef;
分析:
此问题是因为hash的引用值不可以传递到另外一个pl 程序作为参数吗,我尝试传递数组,可以正常传递。
总结问题: $hash_ref 传递到另一个程序中无法正确恢复, 是否使用全局变量会有帮助?
####################################################################
方案2). 是否可以将$hash_ref 的值保存到文件,再读取文件的值,使之恢复成hash_ref 用以处理。
my $FH;
open ($FH,">/usr/home/cel/dumperFN.txt") or die "$!\n";
print Dumper ($hash_ref);
print $FH (Dumper ($hash_ref));
分析: 查阅资料,没有可以将读取(cat 方式)文件的值(如下)恢复成Hash_ref 的方法。
$VAR1 = {
'4' => 'd',
'1' => 'a',
'3' => 'c',
'2' => 'b'
};
总结问题: $hash_ref 通过文件方式,什么方法可以恢复成$hash_ref 呢? 展开
既然能传数组,又何苦强迫症呢……
test.pl:
use strict;
use warnings;
use Data::Dumper;
my $hash_ref = {
'4' => 'd',
'1' => 'a',
'3' => 'c',
'2' => 'b',
};
print "here is test.pl...\n";
print Dumper($hash_ref);
my @array = %$hash_ref;
my $args = join " ", @array;
print $args . "\n";
my $cmd = "perl try.pl $args";
system ("$cmd")
try.pl:
use strict;
use warnings;
use Data::Dumper;
my %rec = @ARGV;
print "\n\nhere is try.pl...\n";
print Dumper (\%rec);
谢谢。其实还有第三种方案,就是将数据通过Filehandler写入到文件 。
如果hash源数据发生了变化,如下,其中value值嵌套hash,何解?
$VAR1 = {
'bar' => 20,
'foo' => {
'cm_code' => 'celch',
}
};
用eval动态生成代码:
try.pl:
use strict;
use warnings;
use Data::Dumper;
print "here is try.pl...\n";
my ($str, $rec, $VAR1);
$str = shift @ARGV;
$str =~ s/'/"/g;
$rec = eval($str);
print Dumper ($rec);
test.pl:
use strict;
use warnings;
use Data::Dumper;
my $str;
my $hash_ref = {
'bar' => 20,
'foo' => {
'cm_code' => 'celch',
}
};
print "here is test.pl...\n";
$str = Dumper ($hash_ref);
print $str;
$str =~ s/\n/ /g;
$str = "\"" . $str . "\"";
my $cmd = "perl try.pl $str";
system ("$cmd");