2009-04-13 3 views
10

Je viens de découvrir que perl ignore l'espace entre le sigil et son nom de variable et se demandait si quelqu'un pouvait me dire si c'était le comportement attendu. Je ne l'ai jamais rencontré auparavant et cela peut entraîner un comportement étrange à l'intérieur des chaînes.L'espace est-il censé être ignoré entre un sigil et son nom de variable?

Par exemple, dans le code suivant, barre de $ finira avec la valeur 'foo':

my $foo = 'foo'; 
my $bar = "$      foo"; 

Cela fonctionne aussi avec les déclarations de variables:

my $ 



bar = "foo\n"; 
print $bar; 

Le second cas n » Ce qui compte vraiment pour moi, mais dans le cas de l'interpolation de chaînes, cela peut conduire à un comportement très confus. Quelqu'un sait-il quelque chose à propos de ça?

Répondre

9

Oui, cela fait partie de la langue. Non, vous ne devriez pas l'utiliser pour un code sérieux. En ce qui concerne la confusion dans l'interpolation, tous les signes dollar (qui ne font pas partie d'une variable) doivent être échappés, pas seulement ceux qui sont à côté des lettres, donc cela ne devrait pas poser de problème.

Je ne sais pas si cela est la véritable raison permettant des espaces entre le Sigil et le nom de la variable, mais il vous permet de faire des choses comme

my $   count = 0; 
my $file_handle_foo = IO::File->new; 

qui pourrait être vu par certaines personnes comme à portée de main (puisqu'il met les sceaux et les parties uniques des noms de variables l'un à côté de l'autre). Il est également utile pour Obfu (voir la fin de la ligne 9 et début de la ligne 10):

#!/usr/bin/perl -w          # camel code 
use strict; 

              $_='ev 
             al("seek\040D 
      ATA,0,     0;");foreach(1..3) 
     {<DATA>;}my    @camel1hump;my$camel; 
    my$Camel ;while(   <DATA>){$_=sprintf("%-6 
9s",$_);[email protected]   1=split(//);if(defined($ 
_=<DATA>)){@camel1hum  p=split(//);}while(@dromeda 
ry1){my$camel1hump=0  ;my$CAMEL=3;if(defined($_=shif 
     t(@dromedary1 ))&&/\S/){$camel1hump+=1<<$CAMEL;} 
     $CAMEL--;if(d efined($_=shift(@dromedary1))&&/\S/){ 
     $camel1hump+=1 <<$CAMEL;}$CAMEL--;if(defined($_=shift(
    @camel1hump))&&/\S/){$camel1hump+=1<<$CAMEL;}$CAMEL--;if(
    defined($_=shift(@camel1hump))&&/\S/){$camel1hump+=1<<$CAME 
    L;;}$camel.=(split(//,"\040..m`{/J\047\134}L^7FX"))[$camel1h 
     ump];}$camel.="\n";}@camel1hump=split(/\n/,$camel);foreach(@ 
     camel1hump){chomp;$Camel=$_;y/LJF7\173\175`\047/\061\062\063\ 
     064\065\066\067\070/;y/12345678/JL7F\175\173\047`/;$_=reverse; 
     print"$_\040$Camel\n";}foreach(@camel1hump){chomp;$Camel=$_;y 
     /LJF7\173\175`\047/12345678/;y/12345678/JL7F\175\173\0 47`/; 
     $_=reverse;print"\040$_$Camel\n";}';;s/\s*//g;;eval; eval 
      ("seek\040DATA,0,0;");undef$/;$_=<DATA>;s/\s*//g;( );;s 
      ;^.*_;;;map{eval"print\"$_\"";}/.{4}/g; __DATA__ \124 
       \1 50\145\040\165\163\145\040\157\1 46\040\1 41\0 
        40\143\141 \155\145\1 54\040\1 51\155\ 141 
        \147\145\0 40\151\156 \040\141 \163\16 3\ 
        157\143\ 151\141\16 4\151\1  57\156 
        \040\167 \151\164\1 50\040\  120\1 
        45\162\ 154\040\15 1\163\  040\14 
        1\040\1 64\162\1  41\144  \145\ 
        155\14 1\162\  153\04  0\157 
         \146\  040\11  7\047\   122\1 
         45\15  1\154\1 54\171   \040 
         \046\   012\101\16   3\16 
         3\15   7\143\15    1\14 
         1\16   4\145\163   \054 
        \040   \111\156\14   3\056 
        \040\   125\163\145\14   4\040\ 
        167\1  51\164\1 50\0   40\160\ 
        145\162        \155\151 
       \163\163        \151\1 
       57\156\056 
+0

Merci Chas, Avez-vous une idée de la raison de ce comportement? –

Questions connexes