2009-04-13 10 views
10

Acabo de descubrir que perl ignora el espacio entre el sigilo y su nombre de variable y me preguntaba si alguien podría decirme si este era el comportamiento esperado. Nunca me he encontrado con esto antes y puede provocar un comportamiento extraño dentro de las cadenas.¿Se supone que se debe ignorar el espacio entre un sigilo y su nombre de variable?

Por ejemplo, en el código siguiente, $ bar va a terminar con el valor 'foo':

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

Esto también funciona con las declaraciones de variables:

my $ 



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

El segundo caso doesn' Realmente me importa mucho, pero en el caso de la interpolación de cuerdas esto puede llevar a un comportamiento muy confuso. Alguien sabe algo acerca de esto?

Respuesta

9

Sí, es parte del lenguaje. No, no deberías usarlo para código serio. En cuanto a la confusión en la interpolación, todos los signos de dólar (que no son parte de una variable) deben ser escapados, no solo los que están al lado de las letras, por lo que no debería ser un problema.

No sé si esta es la verdadera razón detrás de lo que permite el espacio en blanco entre el sello y el nombre de la variable, pero se le permite hacer cosas como

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

que podría ser visto por algunas personas como útil (ya que coloca los sigilos y las partes únicas de los nombres de variables uno al lado del otro). También es útil para Obfu (véase el final de la línea 9 y el principio de la línea 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

Gracias Chas, ¿Tiene usted alguna idea de la razón detrás de este comportamiento? –

Cuestiones relacionadas