web-dev-qa-db-fra.com

Passer un tableau et un scalaire à un sous-programme Perl

Duplicata possible: Comment passer un tableau et une chaîne comme arguments à une fonction?

J'ai une fonction, ou sous-routine, qui prend le premier paramètre en tableau et le second paramètre en scalaire. Par exemple,

sub calc {
    my @array = $_[0];
    my $scalar = $_[1];
    print @array, $scalar;
}

Le problème est que la fonction rend le tableau égal à la première valeur du tableau transmis et que le scalaire est la deuxième valeur du tableau transmis. Lorsque je veux que le premier tableau soit le tableau entier, je ne le fais pas besoin de faire une copie complète du tableau. Par exemple,

my @array = ('51', 'M');
my $scalar = 21;

et

calc(@array, $scalar)

imprimera 51 M quand je veux 51 M 21.

28
E.Cross

Vous devez le transmettre comme référence:

calc(\@array, $scalar)

Et puis accédez-y comme: my @array = @{$_[0]};

48
happydave

Soit utilisez une référence au tableau comme premier argument, soit inversez les arguments pour que le scalaire soit le premier et que le tableau vienne ensuite:

sub reversed_args
{
   my($scalar, @array) = @_;
   # ...
   print @array, $scalar, "\n";
}

my @array = ('51', 'M');
my $scalar = 21;

reversed_args($scalar, @array);

N'essayez pas Perlprototypes (deux articles, un sur Stack Overflow, un sur PerlMonks ).

16
Jonathan Leffler

Passez votre tableau au sous-programme calc comme une référence de tableau:

calc(\@array, $scalar);

Ensuite, dans votre sous-programme calc, vous initialisez vos paramètres d'entrée comme ceci:

sub calc {
  my($array_ref, $scalar) = @_;

  foreach my $item (@$array_ref) {
    # process each item in the array ref
  }
}
10
Sam Choukri

Vous pouvez transmettre une référence au tableau à votre fonction:

calc(\@array, $scalar);

Lorsque vous devez accéder à des éléments de @array dans votre sous-programme, vous pouvez le faire comme ceci:

my $array = $_[0];

# access first element of array
print $array->[0];

Modifier: Comme il s'agit d'une référence au tableau d'origine, toutes les modifications apportées au sous-programme seront reflétées dans le tableau d'origine.

9
Peter Willsey

La liste d'arguments dans un sous-programme Perl est simplement un tableau plat. Si vous souhaitez passer un tableau distinct, vous devez le passer comme référence de tableau.

1