2013-02-27 15 views
11

chciałbym przejść następujące zmienne podprocedury mySubroutine, $name, $age i wówczas wielowymiarowej tablicy:Przekazywanie zmiennych na Perl podprogramu

$name = "jennifer"; 
$age = 100; 

$list[0][0] = "TEST NAME 2"; 
$list[0][1] = "TEST GROUP 2"; 
$[0][2] = 10; 

$[1][0] = "TEST NAME 2"; 
$[1][1] = "TEST GROUP 2"; 
$[1][2] = 2; 

podprogramu

sub mySubroutine 
{ 

} 

Próbowałem $_[0] i @_, ale wydaje mi się, że zmienne nie zostały poprawnie przekazane do podprogramu.

+1

Nie widzę żadnej $ name ani $ age. Jak wywołujesz podprogram? – m0skit0

+5

Twój przykładowy kod pomija niektóre zmienne i najważniejsze - wywołanie funkcji. – Christoph

+0

czy nawet napisałeś w ten sposób 'mySubroutine ($ name, $ age, \ @multidimensional_array)? –

Odpowiedz

24

Istnieje kilka sposobów, aby to zrobić (jak większość rzeczy w Perlu). Ja osobiście zrobić to tak:

sub mySubroutine 
{ 
    # Get passed arguments 
    my ($name, $age, $refList) = @_; 

    # Get the array from the reference 
    my @list = @{$refList}; 
    # Good to go 
} 

# You need to pass @list as reference, so you 
# put \@list, which is the reference to the array 
mySubroutine($name, $age, \@list); 
+3

Lepiej jest użyć odniesienia do tablicy w twoim podrzędu niż zrobić kopię, chyba że specjalnie potrzebujesz kopii na coś. –

+0

Zgoda, ale nie wiem, czy OP chce zmodyfikować oryginalną tablicę, czy nie. – m0skit0

+0

świetnie! Działa to dokładnie tak, jak tego chcę! Dzięki! – user2114919

4

inny sposób, który przechodzi tablicę przez odniesienie, ale potem tworzy kopię tego uniknąć zmieniając oryginalny kiedy go edytować.

sub mySubroutine 
{ 
    ## Retrieve name 
    my $name = shift; 

    ## Retrieve age 
    my $age = shift; 

    ## Retrieve list reference 
    my $refList = shift; 

    ## De-reference the list's scalar 
    my @list = @{$refList}; 
    # Good to go 
} 

## Function call 
mySubroutine($name, $age, \@list); 

Aby uzyskać więcej informacji, zapoznaj się z perlsub (podprogramy Perla).

+1

Jeśli robisz to w ten sposób, lepiej: 'my $ name = shift; my $ age = shift; ... itd. – m0skit0

+0

Dokonano zmian. –

5

Inną opcją, jak długo trzeba przejechać tylko jedną tablicę, to przekazać go normalnie przez wartość jako ostatni element:

sub scalars_and_one_array { 
    my $name = shift; 
    my $age = shift; 

    foreach my $element (@_) 
    { 
     # Do something with the array that was passed in. 
    } 
} 

scalars_and_one_array($name,$age,@array); 

Jednak jest to najbardziej efektywny, aby uniknąć dodatkowej kopii tablicy używając tylko odniesienia w podsieci. Oznacza to, że zmiany w tablicy podrzędnej wpływają na oryginał, jednak:

sub array_by_ref { 
    my $array_ref = shift; 

    foreach my $element (@$array_ref) 
    { 
     # Changing $element changes @original_array! 
    } 
} 

array_by_ref(\@original_array); 
+0

Oczywiście działa to tylko w przypadku przekazywania jednej tablicy. – m0skit0

Powiązane problemy