OVH Cloud OVH Cloud

my avec ou sans () - trou de mémoire idiot

3 réponses
Avatar
FDA
Je fais partie des gens qui apprécient Perl /aussi/ pour sa tolérance à
la suppression des parenthèses inutiles (ouf!). Mais j'ai été surpris en
exécutant ceci (recopié à peu près tel quel du "Spécial Perl" de Linux
Magazine :

----------

sub crible
{ my ($n) = @_;

my @nombres = (2..$n);
my @premiers = ();

while (@nombres)
{
my $prem = shift @nombres;
print "$prem\n";
push @premiers, $prem;
@nombres = grep { ($_ % $prem)!=0 } @nombres;
}

return @premiers;
}

$|=1;

print "on y va\n";
@essai = crible 36000;
print "hop", join " ",@essai, "\n";

-------

de voir que si je remplace :

{ my ($n) = @_;

par (et ça me semblait admissible) :

{ my $n = @_;

eh bien le programme sort direct sans rien imprimer, ni apparemment
exécuter. Bug, ou feature ???

ActivePerl 5.8.3 build 809 utilisé depuis SCiTE sous XP Home (j'ai honte)

Quelqu'un a-t-il une idée de ce qui se passe ???

3 réponses

Avatar
Jean-Francois PARIS
FDA wrote:

de voir que si je remplace :

{ my ($n) = @_;

par (et ça me semblait admissible) :

{ my $n = @_;



oui, c'est normal. tu mets une liste dans un scalaire. Donc perl il a
écrire dans $n la taille de @_, à savoir 1.

C'est admissible, mais çà ne fait pas du tout ce que tu souhaitais.

Donc ton programme ne marche pas. Perl il est sympa mais faut pas
pousser trop loin non plus :)

jf

Avatar
FDA
Jean-Francois PARIS wrote:

si je remplace :

{ my ($n) = @_;

par (et ça me semblait admissible) :

{ my $n = @_;


oui, c'est normal. tu mets une liste dans un scalaire. Donc perl il a
écrire dans $n la taille de @_, à savoir 1.

C'est admissible, mais çà ne fait pas du tout ce que tu souhaitais.


Pigé ! Donc : "my $n = $_[0]"; ça va comme ça ? :)

(en APL, ça se dit "1 take", et c'est tout de même plus lisible...)

Je m'aperçois au passage que les parenthèses derrière le "my" ont
quelque chose d'ambigu dans cette affaire : factorisation du "my" pour
une éventuelle liste de noms et/ou déclaration de liste de noms en
affectande d'une liste de valeurs. Ca explique que j'aie été surpris :D


Avatar
Paul GABORIT
À (at) Tue, 20 Apr 2004 01:40:26 +0200,
FDA écrivait (wrote):
Pigé ! Donc : "my $n = $_[0]"; ça va comme ça ? :)

(en APL, ça se dit "1 take", et c'est tout de même plus lisible...)


On peut aussi dire :

my $n = shift;

Et c'est aussi "lisible" qu'en APL ;-)

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>