Предполагается ли игнорировать пробел между символом и именем переменной? - PullRequest
11 голосов
/ 14 апреля 2009

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

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

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

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

my $



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

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

1 Ответ

11 голосов
/ 14 апреля 2009

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

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

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

, что может показаться некоторым людям удобным (так как он помещает символы и уникальные части имен переменных рядом друг с другом). Это также полезно для Обфу (см. Конец строки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...