OVH Cloud OVH Cloud

use Switch + __DATA__ = bye bye

14 réponses
Avatar
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

4 réponses

1 2
Avatar
Emmanuel Florac
Le Tue, 01 Nov 2011 08:18:27 -0700, Klaus a écrit:


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




Dans ce cas ça doit être un bug de smart match, puisque ça ne correspond
pas à ce qu'on obtient ( ' a' ~~ 'a', en l'occurence c'est facile à
vérifier).

--
Ce qu'il y a d'enivrant dans le mauvais goût c'est le plaisir
aristocratique de déplaire.
C. Baudelaire.
Avatar
Klaus
On 1 nov, 17:30, Emmanuel Florac wrote:
Le Tue, 01 Nov 2011 08:30:12 -0700, Klaus a écrit:

> 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/c869d4e8b7fe5d88?

hl=fr

De ce que j'en comprends c'est plutôt le smart match qui pose problèm e.



Dans mon cas, oui, c'est le smart match qui pose le problème. Mais il
y a beaucoup de problèmes supplémentaires qui touchent le smart match
et la fonctionnalité given/when en même temps, par exemple:
https://groups.google.com/group/perl.perl5.porters/msg/b529f00b0566466b?hl =fr

These first two statements about it each put the lie to the other:
.
| Most of the power comes from implicit smart matching:
| when($foo)
| is exactly equivalent to
| when($_ ~~ $foo)
vs:
| Most of the time, "when(EXPR)" is treated as an implicit
| smart match of $_, i.e. "$_ ~~ EXPR".
.
Those cannot both be true. And they are not. The first is lying.
The second is insufficient, even with elaboration, to explain what
is really going on.



Donc il est raisonnable de traiter les problèmes given/when et les
problèmes de smart match en même temps.
Avatar
Klaus
On 1 nov, 17:32, Emmanuel Florac wrote:
Le Tue, 01 Nov 2011 08:18:27 -0700, Klaus a écrit:

> 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

Dans ce cas ça doit être un bug de smart match, puisque ça ne corre spond
pas à ce qu'on obtient ( ' a' ~~ 'a', en l'occurence c'est facile à
vérifier).



Pour être précis, les cas ' 3' ~~ '3' est positif uniquement parce que
la chaîne de caractères ' 3' a été utilisé dans un printf ("...my
$test = sprintf '%d', $thing;..."). Je précise bien que la chaîne de
caractères ' 3' reste une chaîne de caractères ' 3'.

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]");
}

Je souhaite juste rajouter que le bug ' 3' ~~ '3' est documenté dans
http://perldoc.perl.org/perlsyn.html#Smart-matching-in-detail

30. Num numish[4] numeric equality $a == $b



C'est à dire le sprintf a provoqué que la chaîne de caractères ' 3'
est considéré comme numérique, donc règle 30. devient active et
provoque une comparaison ' 3' == '3'.

A mon avis, le vrai bug est la règle 30. Si cette règle n'existait
pas, le problème ' 3' ~~ '3' serait résolu.
Avatar
Emmanuel Florac
Le Tue, 01 Nov 2011 10:38:16 -0700, Klaus a écrit:


A mon avis, le vrai bug est la règle 30. Si cette règle n'existait pas,
le problème ' 3' ~~ '3' serait résolu.



Allons plus loin, le smart match est un problème dans beaucoup de cas, ce
n'est jamais très clair. Je pense que c'est bien le smart match qui est
une fonctionnalité complètement ratée, pas vraiment le given/when.

--
"If you're not paying for it, you're not the customer; you are
the product being sold."
1 2