我正在尝试收集我的数据库的一些快照,并用它做一些数学运算,但我没有从我的子程序返回我的哈希...
正如你所看到的,我有2个哈希%dbmcfg,%bufsnap,%dbsnap我已经将这3个哈希分为一个哈希我的%snaps =(%bufsnap,%dbmcfg,%dbsnap); ,我是Perl的新手,我开始知道变量的范围概念与shell形成鲜明对比,我已经成功地编写了函数并调用它们。
我得到一些变量错误的目标贬值........这个返回哈希对我很重要,因为我需要将它传递给另一个函数并在该子例程中做一些数学
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
sub snapshots() {
my @tmpdbmcfg = grep /=/,`db2 "get snapshot for dbm"`;
my %dbmcfg;
foreach (@tmpdbmcfg) {
chomp;
s/^\s*//;
s/\s*$//;
my ($col3,$col4) = split /\s*=\s*/,$_,2;
$dbmcfg{$col3}=$col4;
}
#print Dumper(\%dbmcfg);
#if ($dbmcfg{'Max agents overflow'} != 0 ) {
#print "fine\n";
#} else {print "Not\n"; }
my @tmpbufarr=grep /=/,`db2 "get snapshot for bufferpools on awdrt"`;
my %bufsnap;
foreach (@tmpbufarr) {
chomp;
s/^\s*//;
s/\s*$//;
my ($bufsnapkey,$bufsnapval) = split /s*=s*/,$_,2;
$bufsnap{$bufsnapkey} = $bufsnapval;
}
my @tmpdbarr =grep /=/,`db2 "get snapshot for db on awdrt"`;
my %dbsnap;
foreach (@tmpdbarr) {
chomp;
s/^\s*//;
s/\s*$//;
my ($dbsnapkey,$dbsnapvalue) = split /s*=s*/,$_,2;
$dbsnap{$dbsnapkey} = $dbsnapvalue;
}
my %snaps = (%bufsnap,%dbmcfg,%dbsnap);
#print Dumper(\%snaps);
return (\%snaps);
}
&snaps;
#print Dumper(\%snapis);
感谢帮助..........
答案 0 :(得分:4)
您可以返回简单列表和标量值,但更复杂的结构将不起作用,返回时的哈希将扩展为其键和值。你可以这样做:
sub foo {
my (%hash1, %hash2); # hashes lexically scoped to sub only
return { # { .. } creates hash reference
hash1 => \%hash1, # these are key/value pairs
hash2 => \%hash2, # hashes now exported outside the sub
};
}
my $href = foo(); # $href->{hash1} now points to \%hash1
你当然可以即兴发挥:
return (\%hash1, \%hash2);
...
my ($href1, $href2) = foo(); # two hrefs are returned
答案 1 :(得分:0)
一些额外的提示。
如果你要在你的函数上放置一个原型(你可能不应该这样做,因为Perl prototypes don't really do what people think they do),那么你可能不应该使用&符调用该函数 - 作为其中一个&符号的副作用是to turn off prototype checking。
一般来说:
a /您不想使用原型 b /您不想使用旧式(使用&符号)函数调用