2013-03-11 2 views
0

Я пытаюсь собрать некоторые снимки моей БД и сделать некоторую математику с ней, но я не в состоянии вернуть мой хэш из моей подпрограммы ...Как генерировать хэш из подпрограммы?

Как вы можете видеть, у меня есть 2 хэш% dbmcfg,% bufsnap,% dbsnap Я забил эти 3 в один хэш my% snaps = (% bufsnap,% dbmcfg,% dbsnap); , Я новичок в Perl, и я узнал, что понятие возможностей переменных контрастирует с оболочкой, где мне удается писать функции и называть их.

Im получая некоторую цель decleration переменной ошибки ........ Это возвращение хэша важен для меня, как мне нужно, чтобы передать его другие функции и сделать некоторую математику в подмножестве рутинного

#!/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); 

Помощь оценивается ..........

+1

Добавить правильный отступ. Это сделает вещи в 10 раз легче для вас и для нас. – TLP

+0

Ваша подпрограмма - это моментальные снимки, но вы называете это снимками? Кроме того, возвращаемое значение не собирается. – Guru

ответ

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 
+0

** спасибо человеку **, вы всегда помогаете мне вовремя ..... У меня есть ясность в этом вопросе. – mviswa

+0

, кстати, любые предложения по IDE для этого отступа должны быть автоматическими или vi-редакторами по-прежнему лучшими – mviswa

+0

@mViswa Добро пожаловать. Я использую vim/gvim для Windows. – TLP

0

Несколько дополнительных советов.

Если вы собираетесь поставить прототип своей функции (чего вы, вероятно, не должны делать, потому что Perl prototypes don't really do what people think they do), то вам, вероятно, не следует вызывать функцию с использованием амперсанда - как один из побочных эффектов амперсанда to turn off prototype checking.

В общем:

а/Вы не хотите использовать прототипы б/Вы не хотите использовать старый стиль (с помощью амперсанд) вызывает

+0

Спасибо, ....... Следуйте своим советам – mviswa