2013-02-27 24 views
11

Vorrei passare le seguenti variabili subroutine funzione_mia, $name, $age e quindi questo array multidimensionale:variabili di passaggio da una subroutine Perl

$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; 

sottoprogrammi:

sub mySubroutine 
{ 

} 

Ho provato $_[0], e @_, ma non sembra che le variabili siano passate correttamente alla subroutine.

+1

Non vedo alcun $ name o $ age. Come stai chiamando la subroutine? – m0skit0

+5

il codice di esempio manca alcune variabili e la più importante, la chiamata di funzione. – Christoph

+0

hai scritto anche questo come 'mySubroutine ($ name, $ age, \ @multidimensional_array)'? –

risposta

24

Ci sono diversi modi per farlo (come la maggior parte delle cose in Perl). Io personalmente faccio come questo:

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

È preferibile utilizzare un riferimento di matrice nel sottotitolo piuttosto che effettuare una copia, a meno che non si abbia specificamente bisogno della copia per qualcosa. –

+0

Concordato ma non so se l'OP vuole modificare l'array originale o no. – m0skit0

+0

fantastico! Funziona proprio come lo voglio io! Grazie! – user2114919

4

Un altro modo, che passa la matrice per riferimento, ma poi fa una copia di esso per evitare di modificare l'originale quando si modifica.

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); 

Per una migliore comprensione, si prega di fare riferimento a perlsub (subroutine Perl).

+1

Se lo stai facendo in questo modo, meglio: 'my $ name = shift; my $ age = shift; '... ecc. – m0skit0

+0

Apportate le modifiche. –

5

Un'altra opzione, purché si limitano ad una matrice, è passare normalmente dal valore come ultimo elemento:

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); 

Tuttavia, è più efficace per evitare ogni copia aggiuntiva della matrice utilizzando solo un riferimento all'interno del sottotitolo. Ciò significa che le modifiche all'array nel sub influiscono sull'originale, tuttavia:

sub array_by_ref { 
    my $array_ref = shift; 

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

array_by_ref(\@original_array); 
+0

Ovviamente questo funziona solo se stai passando un array. – m0skit0

Problemi correlati