2009-04-13 10 views
10

Ho appena scoperto che perl ignora lo spazio tra il sigillo e il suo nome variabile e mi chiedevo se qualcuno potesse dirmi se questo era il comportamento previsto. Non l'ho mai incontrato prima e può provocare strani comportamenti all'interno delle stringhe.Lo spazio deve essere ignorato tra un sigillo e il suo nome variabile?

Ad esempio, nel seguente codice, $ bar finirà con il valore 'foo':

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

Questo funziona anche con dichiarazioni di variabili:

my $ 



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

Il secondo caso doesn' t molto importante per me, ma nel caso dell'interpolazione delle stringhe questo può portare a comportamenti molto confusi. Qualcuno ne sa qualcosa?

risposta

9

Sì, è parte della lingua. No, non dovresti usarlo per codice serio. Per quanto riguarda la confusione nell'interpolazione, tutti i simboli del dollaro (che non fanno parte di una variabile) dovrebbero essere sfuggiti, non solo quelli accanto alle lettere, quindi non dovrebbe essere un problema.

Non so se questa è la vera ragione dietro permettendo spazi bianchi tra il sigillo e il nome della variabile, ma permette di fare le cose come

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

che potrebbe essere visto da alcune persone come a portata di mano (poiché mette i sigilli e le parti univoche dei nomi delle variabili l'uno accanto all'altro). E 'utile anche per Obfu (vedere la fine della linea 9 e all'inizio della linea 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

Grazie Chas, Avete qualche idea del motivo dietro questo comportamento? –

Problemi correlati