Passer deux ou plusieurs tableaux à un sous-programme Perl
J'ai du mal à passer et la lecture des arguments à l'intérieur de la sous-routine qui devrait avoir deux tableaux.
sub two_array_sum { # two_array_sum ( (1 2 3 4), (2, 4, 0, 1) ) -> (3, 6, 3, 5)
# I would like to use parameters @a and @b as simply as possible
}
# I would like to call two_array_sum here and pass two arrays, @c and @d
J'ai vu et essayé plusieurs exemples sur le web, mais aucun d'entre eux travaillaient pour moi.
source d'informationauteur eold | 2011-04-15
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons dont vous pouvez faire ceci:
Mais avant d'aborder ces-si ce que vous montrez dans votre question au sujet de l'ampleur de ce que vous voulez faire--permettez-moi de suggérer
Liste::MoreUtils::pairwise
Ainsi, lorsque vous écrivez ceci:
Vous pouvez simplement écrire ceci:
Par prototype
Cela fonctionne comme
push
. (Et juste commepush
il demande à avoir un@
sigil sur quelque chose)De cette façon, lorsque vous faites cela
il fonctionne. Alors que normalement, il suffit de se présenter dans votre sous comme une longue liste. Ils ne sont pas pour tout le monde comme vous le verrez dans ma discussion ci-dessous.
Par référence
C'est ce que tout le monde est à vous montrer.
Sur des prototypes
Ils sont capricieux. Cela ne fonctionnera pas si vous avez des refs:
Vous devez passer comme ça:
Cependant, puisque le fait de "tableau les expressions" obtient vraiment laid rapidement avec des tableaux imbriqués profonde, j'ai souvent éviter de Perl les pleurs que vous pouvez surcharger le type de référence Perl prendra en le mettant dans un "caractère de classe" de construire.
\[$@]
signifie que la référence peut être un scalaire ou un tableau.De sorte que tous ces travaux:
Cependant, Perl est toujours pointilleux à ce sujet... pour une raison:
Ou tout autre "constructeur" qui pouvait encore être considéré comme une référence à un tableau. Heureusement, vous pouvez fermer Perl place à ce sujet avec l'ancien Perl 4
&
Puis le mux-ing code dans la sous-prend en charge deux références de tableau.
Passer des références de vos tableaux à la fonction:
et n'utilisez pas
a
oub
comme noms de variable, car$a
et$b
spéciales (pour tri).Je vais citer
man perlref
mais vous devriez lire toutes les:...
Vous avez besoin pour passer des tableaux ou des hachages de votre sous-routine à l'aide de références, par exemple:
Vous ne pouvez pas passer des tableaux de fonctions. Les fonctions ne peuvent accepter une listes de scalaires pour l'argument. En tant que tel, vous devez passer les scalaires qui fournissent suffisamment de données pour recréer les tableaux.
Le moyen le plus simple de le faire est de passer des références à des tableaux.
Vous pouvez même éviter la reconstruction de tableaux et de travailler avec les références directement.
Utilisation:
Crochets construire un tableau anonyme (remplie par le résultat de l'expression à l'intérieur) et renvoie une référence à ce tableau. Par conséquent, le ci-dessus peut aussi être écrite comme suit:
Ces méthodes sont canoniques. Une autre façon de faire:
Lorsque vous faites de cette façon, vous pouvez garder un contrôle beaucoup plus serré de vos variables, plutôt que de subir un rat nid de données du programme mêlés à des informations de configuration.
En général, je n'ai jamais plus de trois ou quatre variables dans n'importe quel programme.
Je garde aussi un système à cela, j'utilise un hachages de listes de valeurs de hachage de listes de chose.
La raison en est que tant que je suis cohérente avec l'alternance dans chaque sens,
Data::Dumper
pouvez dump l'ensemble de la structure -- et je peux mieux contrôler la portée de données, et peuvent passer ensemble de structures autour de avec la facilité.Je me retrouve souvent passer plusieurs structures de ce type pour les sous-routines. Comme les scalaires, ils passent assez bien, merci.