2015-09-29 24 views
28

Sadece bir kod parçası verildi. Çalışıyor gibi görünüyor, ama - perlvar'da listelenen %_ yok. küresel kapsamı gibi görünüyor olsa da

Normalde .: örn

my %seen; my @list = grep { not $seen{$_}++ } @list; 

Ama %_%seen bildirerek yukarıda yazılı olurdu, iş gibi görünüyor. Herkes bana referans için işaret edebilir mi? (Ya da en azından bana yukarıdaki şeyi yapmanın önemli bir şeyleri parçalamadığını söyleme!)

+9

Bu konuyla ilgili bazı tartışmalar: http://www.perlmonks.org/?node_id=11757 –

+0

İlgi çekici. Yani '_' tipglob bir kalan kadar basit olabilir? 15 yıl önce daha yeni bir şey olup olmadığını merak ediyorum. (Ama sanırım değişmemiş olsaydı, bunun için bir sebep olmazdı). – Sobrique

+0

Aynı snile sahip olan 'sn%'; – ikegami

cevap

23

Bu bir hash. _ adlı karma bir tablonuz olabilir, çünkü _ değişken için geçerli bir addır. (Sana $_ ve @_ aşina eminim.) Hayır Perl yerleşik

o anda ona ayarlar veya dolaylı %_ okur, ancak bu tür %_ olarak noktalama değişkenleri saklıdır.

Perl değişken adları aynı zamanda bir rakam dizisi ya da tek noktalama işareti ya da kontrol karakteri de olabilir (gerçek denetim karakter formuyla birlikte kullanımdan kaldırılmış). Bu isimler her noktalama değişkenler de onlar "süper globaller" olduğunu özel olduklarını Not


Perl

tarafından özel kullanımlar için ayrılmıştır. Bu, nitelenmemiş %_'un geçerli pakette %_ değil, kök paketinde %_ anlamına gelir.
$ perl -E' 
    %::x = (name => "%::x" ); 
    %::_ = (name => "%::_" ); 
    %Foo::x = (name => "%Foo::x"); 
    %Foo::_ = (name => "%Foo::_"); 

    package Foo; 

    say "%::x = $::x{name}"; 
    say "%::_ = $::_{name}"; 
    say "%Foo::x = $Foo::x{name}"; 
    say "%Foo::_ = $Foo::_{name}"; 

    say "%x  = $x{name}"; 
    say "%_  = $_{name}"; 
' 
%::x = %::x 
%::_ = %::_ 
%Foo::x = %Foo::x 
%Foo::_ = %Foo::_ 
%x  = %Foo::x 
%_  = %::_  <-- surprise! 

Bu

(yaptığın gibi) çok geniş kapsamlı etkileri olabilir local %_ kullanmayı unutma anlamına gelir.

İlgili konular