2014-06-08 8 views
2

Je l'ai remarqué en regardant another question ...Perl flip opérateur flop et les numéros de ligne

Si j'ai un script comme ceci:

while (<>) { 
    print if 5 .. undef; 
} 

Il saute les lignes 1..4 imprime le reste du fichier. Cependant, si j'essaie ceci:

my $start_line = 5; 
while (<>) { 
    print if $start_line .. undef; 
} 

Il imprime de la ligne 1. Quelqu'un peut-il expliquer pourquoi?

En fait, je ne suis même pas sûr de savoir pourquoi le premier fonctionne.

Hmmm regardant plus loin dans ce que je trouve que cela fonctionne:

my $start = 5; 
while (<>) { 
    print if $. == $start .. undef; 
} 

La première version utilise comme par magie $. qui est le numéro de ligne. Mais je ne sais pas pourquoi cela échoue avec une variable.

Répondre

9

L'utilisation d'un nombre brut dans la bascule est traitée comme un test par rapport à la variable de comptage de ligne, $.. De perldoc perlop:

Si l'un des opérandes de ".." scalaire est une expression constante, que opérande est considéré comme vrai si elle est égale (==) à l'entrée actuelle numéro de ligne (la variable $.).

Alors

print if 5 .. undef; 

est "raccourci" pour:

print if $. == 5 .. undef; 

La même chose est pas vrai pour une variable scalaire comme il est pas une expression constante. C'est pourquoi il n'est pas testé contre $..

+1

Perl est parfois plus un «livre de sorts magiques» qu'un langage. –

+2

@JohnC: C'est encore plus vrai pour la langue anglaise :) – Zaid

Questions connexes