0

データベースのスナップショットをいくつか収集して計算しようとしていますが、サブルーチンからハッシュを返すことができません...

ご覧のとおり、2 つのハッシュ %dbmcfg,%bufsnap,%dbsnap があります。これら 3 つを 1 つのハッシュにまと​​めました。 %snaps =(%bufsnap,%dbmcfg,%dbsnap); 、私はPerlを初めて使用し、変数のスコープの概念があることを知りました.シェルとは対照的に、関数を記述して呼び出すことに成功しています.

私は変数エラーのいくつかの目標宣言を取得しています........この返すハッシュは、別の関数に渡し、そのサブルーチンでいくつかの計算を行う必要があるため、私にとって重要です

#!/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 のプロトタイプは、人々が考えていることを実際には実行しないため、おそらく行うべきではありません)、おそらくアンパサンドを使用して関数を呼び出すべきではありません -アンパサンドの副作用の 1 つは、プロトタイプのチェックをオフにすることです。

一般に:

a/ プロトタイプを使用したくない b/ 古いスタイルの (アンパサンドを使用した) 関数呼び出しを使用したくない

于 2013-03-11T09:55:04.230 に答える