Perl Récursivité et de Fonctions
Avoir entendu parler de Perl pour l'année, j'ai décidé de lui donner quelques heures de mon temps pour voir combien j'ai pu récupérer. J'ai eu à travers les notions de base de l'amende et puis à boucles. Comme un test, j'ai voulu voir si je pouvais construire un script récursif à travers toutes les valeurs alphanumériques jusqu'à 4 caractères. J'avais écrit un code PHP qui fait la même chose il y a quelques temps donc j'ai pris le même concept et à l'utiliser. Cependant lorsque je lance le script, il met "une" que les 3 premières valeurs et ensuite seulement les boucles à travers le dernier chiffre. Quelqu'un voit ce que je fais de mal?
#!/usr/local/bin/perl
$chars = "abcdefghijklmnopqrstuvwxyz";
$chars .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$chars .= "0123456789";
@charset = split(//, $chars);
$charset_length = scalar(@charset);
sub recurse
{
($width, $position, $base_string) = @_;
for ($i = 0; $i < $charset_length; ++$i) {
$base = $base_string . $charset[$i];
if ($position < $width - 1) {
$pos = $position + 1;
recurse($width, $pos, $base);
}
print $base;
print "\n";
}
}
recurse(4, 0, '');
C'est ce que j'obtiens quand je le lance:
aaaa
aaab
aaac
aaad
aaae
aaaf
aaag
aaah
aaai
aaaj
aaak
aaal
aaam
aaan
aaao
aaap
aaaq
aaar
aaas
aaat
aaau
aaav
aaaw
aaax
aaay
aaaz
aaaA
aaaB
aaaC
aaaD
aaaE
aaaF
aaaG
aaaH
aaaI
aaaJ
aaaK
aaaL
aaaM
aaaN
aaaO
aaaP
aaaQ
aaaR
aaaS
aaaT
aaaU
aaaV
aaaW
aaaX
aaaY
aaaZ
aaa0
aaa1
aaa2
aaa3
aaa4
aaa5
aaa6
aaa7
aaa8
aaa9
aaa9
aaa9
aaa9
a toujours le même problème :/ j'ai corrigé le code ci-dessus.
OriginalL'auteur Chris | 2011-07-25
Vous devez vous connecter pour publier un commentaire.
Vous avez été mordu par des non stricte délimitation de l'étendue, ce code fait ce qu'il doit (notez l'utilisation stricte en haut et l'utilisation ultérieure de mon pour garantir la variable de portée).
OriginalL'auteur JohnKlehm
Déjà bien répondu, mais un plus idiomatiques approche serait:
Il n'y a pas besoin de passer de la position; elle est implicite dans la largeur de la base de la chaîne de transmission. Le jeu de caractères, d'autre part, doit être passé plutôt que d'avoir une sous-routine d'utiliser une variable externe.
Sinon, étant donné que la largeur et le jeu de caractères constants, générer une fermeture qui y fait référence:
Sinon, juste:
merci, fixe je pense
OriginalL'auteur ysth
Il a à voir avec la portée des variables, vous êtes encore en train d'évoluer de la même vars lorsque vous êtes à l'appel de la récursivité. Le mot-clé " mon " déclare les variables locales à la sous-routine.
(http://perl.plover.com/FAQs/Namespaces.html)
J'ai toujours utiliser perl avec "use strict;" a déclaré, m'obligeant à me décider sur la portée des variables.
OriginalL'auteur PtPazuzu
Vous semblent être en cours d'exécution dans certains de délimitation de l'étendue des problèmes. Perl est très souple, donc il faut deviner ce que vous voulez parce que vous n'avez pas dit ce que vous voulez. Une des premières choses que vous allez apprendre à ajouter
use strict;
que pour votre première déclaration après le shebang. Il mettra en évidence les variables qui ne sont pas explicitement définies, ainsi que toutes les variables qui sont accessibles à l'avant en cours de création (aide à la mal orthographié variables, etc).Si vous faites votre code ressemble à ceci, vous comprendrez pourquoi vous obtenez vos erreurs:
Cela devrait sortie:
Parce que vous n'êtes pas à la portée
$position
correctement avecmy
, vous n'obtenez pas une nouvelle variable à chaque boucle, vous ré-utilisez le même. Jetez unuse strict;
là, et de corriger les erreurs que vous obtenez, et le code doit être bon.OriginalL'auteur Jack M.
Je me rends compte que vous êtes tout simplement bricoler avec la récursivité. Mais aussi longtemps que vous êtes amusant de comparer les implémentations entre les deux langues, vous pouvez également voir comment le CPAN pouvez étendre votre outil.
Si vous n'avez pas de soins sur la commande, vous pouvez générer tous les 13,388,280 permutations de
( 'a'..'z', 'A..'Z', '0'..'9' )
pris quatre à la fois avec le module CPAN, Algorithme::PermuterVoici un exemple de comment ce code peut regarder.
La
new()
méthode accepte un tableau ref qui énumère l'ensemble des caractères ou de la liste de ce que à permuter. Son deuxième argument est combien à l'heure à inclure dans la permutation. Donc, vous êtes essentiellement de la prise de 62 articles 4 à la fois. Ensuite, utilisez lanext()
méthode pour itérer sur les permutations. Le reste est juste de la poudre aux yeux.La même chose pourrait être réduite à la suite de Perl one-liner:
Il y a aussi une section sur la permutation, le long de avec d'autres exemples à perlfaq4. Il comprend plusieurs exemples et une liste de certains des modules supplémentaires qui gèrent les détails pour vous. L'un de Perl forces de l'est de la taille et de l'exhaustivité de la Comprehensive Perl Archive Network (CPAN).
OriginalL'auteur DavidO