12 votes

Passer des variables à un sous-programme Perl

J'aimerais passer les variables suivantes à la sous-routine mySubroutine, $name, $age puis ce tableau multidimensionnel :

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

Sous-programme :

sub mySubroutine
{

}

J'ai essayé $_[0] et @_ mais je n'arrive pas à faire passer correctement les variables à la sous-routine.

27voto

m0skit0 Points 10269

Il y a plusieurs façons de le faire (comme la plupart des choses en Perl). Personnellement, je procède comme suit :

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

6voto

Une autre méthode consiste à passer le tableau par référence, mais à en faire une copie pour éviter de modifier l'original lorsque vous le modifiez.

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

Pour une meilleure compréhension, veuillez vous référer à perlsub (sous-programmes Perl).

6voto

Une autre option, tant que vous ne passez qu'un seul tableau, est de le passer normalement par valeur en tant que dernier élément :

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

Cependant, il est plus efficace d'éviter toute copie supplémentaire du tableau en n'utilisant qu'une référence à l'intérieur du sous-menu. Cela signifie toutefois que les modifications apportées au tableau dans le sous-ensemble affectent l'original :

sub array_by_ref {
    my $array_ref = shift;

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

array_by_ref(\@original_array);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X