2010-05-21 13 views

Odpowiedz

10

Cóż, jeśli chcesz dwa tablice można użyć prototype:

sub foo (\@\@) { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(@wiz, @waz); # @wiz and @waz won't be flattened. 

ale istnieje wiele sposobów, aby dostać się wokół prot otypy i wolę ich unikać w większości miejsc. można po prostu pominąć prototyp i ręcznie przekazać referencje:

sub foo { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(\@wiz, \@waz); # Pass in wiz/waz as refs 
foo([1,2,4],[3,5,6]); # Hard coded arrays 

Jeśli nie pracował z odniesieniami w ogóle, sprawdź perlreftut za miły tutoriala.

+0

wydaje się, że prototyp jest lepszym rozwiązaniem, ponieważ nie wymagałoby to od użytkownika zrobienia czegoś specjalnego, aby przekazać argumenty z listy. dzięki – Mike

+14

@Mike, polecam przeciwko prototypom, ponieważ doświadczony programista perl będzie bardziej zaskoczony niż wymaganie przekazania referencji. Sprawdź http://stackoverflow.com/questions/297034/why-are-perl-function-prototypes-bad, aby dowiedzieć się więcej o tym, dlaczego prototypy są mile widziane. – daotoad

+0

@Mike, używam prototypów tak często, że popełniłem błąd w mojej specyfikacji prototypu, którą właśnie zrealizowałem. Jeśli więc wypróbowałeś już próbkę mojego kodu i nie zadziałał, zwróć uwagę na zmianę w prototypie. – daotoad

5

Jeśli przekażesz dwie listy według wartości ... dostaniesz jedną dużą listę w @_.

my(@list1,@list2) = @_; nie ma żadnego sensu:

#!/usr/bin/perl 

sub test 
{ 
    my (@a, @b) = @_; 

    print "@a\n"; 
    print "@b\n"; 
} 

my @array1 = (1,2,3); 
my @array2 = (5,6,7); 

test(@array1, @array2); 

ta zakończy się druk:

1 2 3 5 6 7 
<blank line> 

zdać dwie tablice, trzeba by przekazać je poprzez odniesienie:

test(\@array1, \@array2); 

W twoim podsiebie musisz traktować je jak referencje:

sub test 
{ 
    my ($arrayRef1, $arrayRef2) = @_; 
    print "@$arrayRef1\n"; 
    print "@$arrayRef2\n"; 
}