Je travaille sur le patch de Zoidberg Perl shell pour corriger certaines erreurs que les versions modernes de Perl lancent lors des tests. Remarque, je ne suis pas l'auteur original et je ne le critique pas non plus. Je suis tombé sur un problème intéressant sur lequel j'aimerais avoir un peu d'histoire.
Le code ci-dessous prend un tableau d'entrées et pour chaque sigil de fin de bande et de fin. Ensuite, il stocke ce sigil dans une variable, s'il ne l'a pas trouvé à la place. Le code qui était dans le fichier d'origine ressemblait à un test A et devait avoir fonctionné jusqu'à et y compris perl v5.8 donné cpantesters résultats. Quoi qu'il en soit, le problème est que si le // s ne se trouve pas dans un test "if", lors de la boucle, la variable $ 1 persiste avec la dernière valeur. Voici mes tests. Je me demandais si les gens pouvaient expliquer pourquoi cela se produisait et/ou pourquoi cela fonctionnait, je pense que je comprends ce qui se passe.
#!/usr/bin/perl
use strict;
use warnings;
my @a = qw/n a$ [email protected] c/;
my @b = @a;
my @c = @a;
print "Test A -- Doesn't work (c !-> 0)\n";
for (@a) {
s/([\$\@\%])$//;
my $arg = $1 || 0;
print $_ . " -> " . $arg . "\n";
}
print "\nTest B -- Works\n";
for (@b) {
my $arg;
if (s/([\$\@\%])$//) {;
$arg = $1;
}
$arg ||= 0;
print $_ . " -> " . $arg . "\n";
}
print "\nTest C -- Works, more clever\n";
for (@c) {
my $arg = s/([\$\@\%])$// ? $1 : 0;
print $_ . " -> " . $arg . "\n";
}
C'est pourquoi, dans la plupart des cas, il faut utiliser 'if (regex) {# use $ 1, etc.'. – musiKk
Merci pour cela, cela n'a pas toujours été le cas, ce comportement a-t-il changé, peut-être avec la version 5.10? Je suis nouveau à la scène Perl, ~ 1 an. –
'Je ne pense pas que le comportement 5.8 ait jamais été voulu. 'Ouais, je pense que c'est ce que je me demandais. Merci! –