Предполагается ли, что пространство должно игнорироваться между символом sigil и его именем переменной?

Я только что обнаружил, что perl игнорирует пространство между сигил и его имя переменной и задается вопросом, может ли кто-нибудь сказать мне, было ли это ожидаемое поведение. Я никогда не сталкивался с этим раньше, и это может привести к странному поведению внутри строк.

Например, в следующем коде $bar будет иметь значение "foo":

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

Это также работает с объявлениями переменных:

my $



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

Второй случай для меня не имеет большого значения, но в случае интерполяции строк это может привести к очень запутанному поведению. Кто-нибудь знает об этом?

Ответ 1

Да, это часть языка. Нет, вы не должны использовать его для серьезного кода. Что касается запутывания в интерполяции, все знаки доллара (которые не являются частью переменной) должны быть экранированы, а не только рядом с буквами, поэтому это не должно быть проблемой.

Я не знаю, является ли это реальной причиной разрешения пробелов между сигилом и именем переменной, но она позволяет вам делать такие вещи, как

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",$_);[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