2013-08-11 10 views
15

Jaki jest najlepszy sposób na wysłanie wielu tablic, zmiennych, skrótów do podprogramu?Przekazywanie tablicy, skalaru i skrótu do podprogramu w Perlu

Prosty formularz, działa.

my $msg = &getMsg(1,2,3); 
print $msg; 

sub getMsg { 
    my($a, $b, $c) = @_; 
} 

Mam trudności z tej wersji i nie jestem pewien, jak wysyłać dane bezpiecznie do podprogramu bez użycia globalnym, który nie jest to, co chcę robić.

my @array = ('a','b','c'); 
my $str = "Hello"; 
my %hash = (
    'a' => ['100','nuts'], 
    'b' => ['200','bolts'], 
    'c' => ['300','screws'], 
); 

my $msg = getMsg(@array, $str, %hash); 
print $msg; 

sub getMsg { 
    my (@a, $s, %h) = @_; 
    my $MSG; 
    foreach my $x (@a) { 
     $MSG .= "\n$str, $x your hash value = $h{$x}[0] $h{$x}[1]"; 
    } 
    return $MSG 
} 

Odpowiedz

21

Można użyć nazwy:

getMsg(\@array, \%hash, $scalar); 

sub getMsg { 
    my ($aref, $href, $foo) = @_; 
    for my $elem (@$aref) { 
     ... 
    } 
} 

pamiętać, że przypisanie próbowałeś:

my (@a, $s, %h) = @_; 

Nie działa, bo @a - będąc tablicę - będzie slurp w górę całą listę, pozostawiając niezainicjowane $s i %h.

+0

Zauważ, że przekazany hashref musi zostać usunięty z pamięci, gdy jest używany w sub '$ MSG. =" \ N $ str, $ x twoja wartość hash = $ h -> {$ x} -> [0] $ h- > {$ x} -> [1] "; ' – BarneySchmale

5

wolę odpowiedź TLP, ale można też użyć prototype:

getMsg(@array, %hash, $scalar); 

sub getMsg (\@\%$) { 
    my ($aref, $href, $foo) = @_; 
    for my $elem (@$aref) { 
     ... 
    } 
} 

Prototyp (\@\%$) wymusza argumenty do wywołania podprogramu z odniesieniem listy, odniesienie hash i skalarne przed na argumenty są spłaszczane i ładowane do @_. Wewnątrz podprogramu pojawia się odwołanie do listy i odwołanie do hasza zamiast tablicy i skrótu.

Zwykle jednak, don't use prototypes.

Powiązane problemy