0

我正在尝试收集我的数据库的一些快照并用它做一些数学运算,但我无法从我的子例程中返回我的哈希......

如您所见,我有 2 个哈希 %dbmcfg,%bufsnap,%dbsnap 我已将这 3 个哈希合并为一个哈希 my %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);

帮助表示赞赏............

4

2 回答 2

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
于 2013-03-11T04:33:14.270 回答
0

一些额外的提示。

如果你打算在你的函数上放置一个原型(你可能不应该这样做,因为Perl 原型并没有真正做人们认为他们做的事情),那么你可能不应该使用 & 号来调用函数 -作为&符号的副作用之一是关闭原型检查

一般来说:

a/ 你不想使用原型 b/ 你不想使用旧式(使用 & 符号)函数调用

于 2013-03-11T09:55:04.230 回答