use Switch + __DATA__ = bye bye
Le
luc2

#!/usr/bin/perl
# bonjour a tous, le script suivant n'affichera rien
# pouvez-vous m'expliquer pourquoi ?
use Switch;
while( my $l = <DATA> )
{
print $l;
}
__DATA__
1
2
3
4
5
# bonjour a tous, le script suivant n'affichera rien
# pouvez-vous m'expliquer pourquoi ?
use Switch;
while( my $l = <DATA> )
{
print $l;
}
__DATA__
1
2
3
4
5
Le module Switch surcharge '__' (voir la doc).
Pour éviter ça, utiliser :
use Switch 'noimport';
(ce n'est pas dans la doc mais dans le code du module :-) )
HTH
J-L
--
http://www.bribes.org/perl/
Une remarque, pourquoi utiliser switch? son usage est déconseillé, car
dangereux et fragile, et à partir de perl 5.10 (qui est dispo même sur
les distros les plus conservatrices genre RedHat) il y a given/when qui
lui est sûr, sans danger et sans effets de bords merdiques.
tl,dr; ne pas utiliser switch, mais given/when.
--
Most software today is very much like an Egyptian pyramid with millions
of bricks piled on top of each other, with no structural integrity, but
just done by brute force and thousands of slaves.
Alan Kay
given/when n'est pas non plus sans problèmes.
Voici un cas de test:
use strict;
use warnings;
use 5.010;
use Test::More tests => 2;
for my $thing ('3', ' 3') {
my $test = sprintf '%d', $thing;
my $result = '';
given ($thing) {
when ('3') { $result .= "[3]"; continue; }
when (' 3') { $result .= "[ 3]"; continue; }
}
is ($result, "[$thing]", "Test [$thing]");
}
le test échoue car le smart match entre '3' et ' 3' est positif (il
devrait être négatif car '3' ne ' 3').
Non, il doit être positif parce que c'est un smart match ~~, pas un
simple match eq ou ne. Vu que " 3" =~ "3", il n'y a pas d'erreur. C'est
plutôt parce que tu ne sais pas utiliser les regexp :)
Tu peux vérifier :
perl -e "print qq(matchn) if ( ' 3' =~ '3' )"
--
I love deadlines, I love the whooshing noise they make as they go by.
Douglas Adams
plus d'etre une experience temporaire qu'une fonctionnalite qui va rester...
au contraire d'autres bouts plus triviaux comme say...
En ce qui concerne les expression régulières, tu aurais raison si
j'avais utilisé ' 3' ~~ qr{3}. Dans ce cas le smart-match utilise les
expressions régulières.
Par contre, j'ai utilisé ' 3' ~~ '3' ce qui traduit dans le cas 32.
"Any Any" ==> string equality $a eq $b du tableau
http://perldoc.perl.org/perlsyn.html#Smart-matching-in-detail
Actuellement, il y a un développement en cours (Perl 5.14 / Perl 5.15)
qui essaie de corriger les problèmes de given/when par un nouveau
module:
voir https://groups.google.com/group/perl.perl5.porters/msg/c869d4e8b7fe5d8 8?hl=fr
hl=fr
De ce que j'en comprends c'est plutôt le smart match qui pose problème.
--
Le commissaire : Comment vous appelez-vous?
Garance : Moi je ne m'appelle jamais, je suis toujours là. J'ai pas
besoin de m'appeler. Mais les autres m'appellent Garance, si ça peut
vous intéresser.
Prévert,"les enfants du Paradis".