Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何从子例程生成哈希?_Perl_Subroutine_Hash - Fatal编程技术网

Perl 如何从子例程生成哈希?

Perl 如何从子例程生成哈希?,perl,subroutine,hash,Perl,Subroutine,Hash,我试图收集我的数据库的一些快照,并用它做一些数学运算,但我无法从我的子例程返回我的哈希 如您所见,我有两个哈希%dbmcfg,%bufsnap,%dbsnap我已将这三个哈希组合成一个哈希%snap=(%bufsnap,%dbmcfg,%dbsnap),我是Perl新手,我知道变量的作用域概念与shell不同,在shell中我成功地编写函数并调用它们 我得到了一些变量错误的目标偏差……。这个返回哈希对我来说很重要,因为我需要将它传递给另一个函数,并在该子程序中进行一些数学运算 #!/usr/bi

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

如您所见,我有两个哈希%dbmcfg,%bufsnap,%dbsnap我已将这三个哈希组合成一个哈希%snap=(%bufsnap,%dbmcfg,%dbsnap),我是Perl新手,我知道变量的作用域概念与shell不同,在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);

感谢您的帮助

您可以返回简单的列表和标量值,但更复杂的结构将不起作用,并且返回的哈希将扩展为它们的键和值。您可以这样做:

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

您可以返回简单的列表和标量值,但更复杂的结构将不起作用,并且返回的哈希将扩展为它们的键和值。您可以这样做:

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

一些额外的提示

如果你要在你的函数上放置一个原型(你可能不应该这样做,因为),那么你可能不应该使用一个符号AND来调用这个函数,因为符号AND的一个副作用是

一般而言:

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

还有一些额外的提示

如果你要在你的函数上放置一个原型(你可能不应该这样做,因为),那么你可能不应该使用一个符号AND来调用这个函数,因为符号AND的一个副作用是

一般而言:

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

添加适当的缩进。这将使您和我们的工作轻松10倍。您的子例程是快照,但您将其称为快照?此外,未收集返回值。请添加适当的缩进。这将使您和我们的工作轻松10倍。您的子例程是快照,但您将其称为快照?另外,返回值没有被收集。谢谢你,你总是及时帮助我。我明白了这一点。再次非常感谢……顺便说一句,关于IDE上自动缩进或vi编辑器仍然是最佳缩进的任何建议谢谢你,你总是按时帮助我……我明白了这一点。再次非常感谢……顺便说一句,关于IDE自动缩进或vi编辑器的任何建议仍然是最好的