在sigil和变量名之间是否应该忽略空间?

时间:2009-04-13 20:31:08

标签: perl

我刚刚发现perl忽略了sigil和它的变量名之间的空格,并想知道是否有人可以告诉我这是否是预期的行为。我以前从未遇到过这种情况,它可能导致字符串内部出现奇怪的行为。

例如,在以下代码中,$ bar最终会得到值'foo':

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

这也适用于变量声明:

my $



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

第二种情况对我来说并不重要,但在字符串插值的情况下,这可能会导致非常混乱的行为。有人对此有所了解吗?

1 个答案:

答案 0 :(得分:9)

是的,它是该语言的一部分。不,你不应该将它用于严肃的代码。至于插值中的混淆,所有美元符号(不是变量的一部分)都应该被转义,而不仅仅是字母旁边的符号,所以它应该不是问题。

我不知道这是否是在sigil和变量名之间允许空格的真正原因,但它允许你做像

这样的事情
my $            count = 0;
my $file_handle_foo   = IO::File->new;

有些人可能会认为它很方便(因为它将变量名的符号和唯一部分放在一起)。它对Obfu也很有用(参见第9行末尾和第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",$_);my@dromedary           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