Comment puis-je passer deux tableaux, et une chaîne à un sous-programme Perl?
Comment puis-je passer deux tableaux, et une chaîne à un sous?
Voici ce que j'essaie de faire:
use strict;
use warnings;
my @x = qw(AAAA BBBB CCCC DDDD EEEE);
my @y = qw(1111 2222 3333 4444 5555);
my $z = "hello";
Hello(@x,@y,$z);
exit(0);
sub Hello {
my (@x,@y,$z) = @_;
print "$_\n" for @x;
print "$_\n";
print "$_\n" for @y;
print "$_\n";
print "$z\n";
}
De sortie:
AAA
BBBB
CCCC
DDDD
EEEE
1111
2222
3333
4444
5555
hello
Use of uninitialized value $_ in concatenation (.) or string at test.pl line 19.
Use of uninitialized value $_ in concatenation (.) or string at test.pl line 21.
Use of uninitialized value $z in concatenation (.) or string at test.pl line 22.
OriginalL'auteur user476918 | 2010-10-21
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour passer chacun des tableaux comme une référence, sinon votre
@x
dans le sub va engloutir l'ENSEMBLE de l'éventail des arguments, laissant@y
un vide arraay et$z
une valeur undef.Cela se produit parce que l'opérateur virgule - dans un contexte de liste - un
@x, @y, $z
dans un seul tableau contenant tous les éléments de@x
suivie par tous les éléments de@y
et puis une valeur de$z
; votre@x
dans la sous avaler l'ENSEMBLE combiné de tableau d'arguments, laissant@y
un tableau vide et$z
une valeur undef.Une autre source possible de confusion est le fait que vous avez nommé deux variables
@x
, malgré le fait qu'ils sont complètement indépendants les uns des autres en raison de règles de portée. Bonne pratique serait de nommer quelque chose de distinct pour éviter d'avoir à vous de deviner lequel vous utilisez, par exemple, appeler le sous-programme du premier tableau@x2
.Veuillez noter que vous pouvez passer le tableau en tant que référence dans l'une des deux façons - la référence pour le tableau d'origine (réelle passe par méthode de référence) ainsi que la référence à une COPIE du tableau qui va se comporter comme tu le voulais votre origainal code de comportement et le passage par valeur.
OriginalL'auteur DVK
vous avez besoin d'utiliser des références:
vous pouvez également utiliser Perl sous-routine prototypes pour éliminer les
\
sur le site d'appel:La
(\@\@$)
prototype indique au compilateur que les arguments deHello
aura de la matrice de cadre de référence sur les deux premiers arguments, et un contexte scalaire sur la troisième arg. Les Prototypes ne sont pas pour la validation d'arguments, ils sont de vous permettre d'écrire des sous-routines qui fonctionnent comme les objets internes. Dans ce cas, commepush
.Comme DVK mentionne dans un commentaire ci-dessous, PBP déconseille d'utiliser des prototypes comme une règle générale, car ils ont tendance à être mal utilisé pour la validation d'arguments. J'ai l'impression que l'utilisation de certaines fonctionnalités de prototypes (
\%
ou\@
imposer de cadre de référence pour le pluriel de types ou de&
dans un premier arg pour permettremap
comme bloc de syntaxe) justifiant la rupture avec le PBP. Particulièrement vrai si le sub est utilisé pour étendre la syntaxe de Perl (fonctions d'assistance, les fonctions qui sont tout sucre syntaxique...)OriginalL'auteur Eric Strom
Vous devez passer dans les références de tableau:
OriginalL'auteur CanSpice
OriginalL'auteur bob.faist