2009-04-13 29 views
10

Tôi vừa phát hiện ra rằng perl bỏ qua không gian giữa sigil và tên biến của nó và đã tự hỏi nếu có ai đó có thể cho tôi biết nếu đây là hành vi mong đợi. Tôi đã không bao giờ chạy vào điều này trước và nó có thể dẫn đến hành vi lạ bên trong của dây.Có phải không gian bị bỏ qua giữa một sigil và tên biến của nó không?

Ví dụ, trong đoạn mã sau, $ thanh sẽ kết thúc với giá trị 'foo':

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

này cũng làm việc với các khai báo biến:

my $ 



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

Trường hợp thứ hai doesn' t thực sự quan trọng đối với tôi nhưng trong trường hợp nội suy chuỗi, điều này có thể dẫn đến hành vi rất khó hiểu. Bất cứ ai biết bất cứ điều gì về điều này?

Trả lời

9

Có, nó là một phần của ngôn ngữ. Không, bạn không nên sử dụng nó cho mã nghiêm trọng. Đối với việc khó hiểu trong nội suy, tất cả các ký hiệu đô la (không phải là một phần của một biến) nên được thoát, không chỉ các ký hiệu bên cạnh các chữ cái, do đó, nó không phải là một vấn đề.

Tôi không biết nếu điều này là lý do thực sự đằng sau cho phép khoảng trắng ở giữa sigil và tên biến, nhưng nó cho phép bạn làm những việc như

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

mà có thể được nhìn thấy bởi một số người như tiện dụng (vì nó đặt các sigils và các phần duy nhất của các tên biến bên cạnh nhau). Nó cũng hữu ích cho Obfu (xem phần cuối của dòng 9 và bắt đầu của dòng 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

Cảm ơn Chas, Bạn có biết lý do đằng sau hành vi này không? –

Các vấn đề liên quan