2015-07-03 9 views
13

yere alınan bu örnekte + şeker levhayı anlamıyorum

use Data::Dumper; 

# Not any differences here 
my $foo = {value => 55}; 
my $bar = +{value => 55}; 

print Dumper $foo; 
print Dumper $bar; 

# Oh ! Here there is something... 
sub foo { {$_[1] => $_[2]} }; 
sub bar { +{$_[1] => $_[2]} }; 

print Dumper foo('value', 55);  
print Dumper bar('value', 55);  

foo döner

$VAR1 = 55; 
$VAR2 = undef; 

bar döner

$VAR1 = { 
      '55' => undef 
     }; 
+2

Zaten Veri :: Damper kullanıyor, bu yüzden basitleştirilmiş ve yöntem bu bulmak için kullanmaktır Dahası insanlar – ikegami

cevap

16

Çözümleyicinin anonim bir karma ve bir kod bloğu arasında ayrım yapmasına yardımcı olur.

blokları ve anonim karma kurucular sözdizimi ağacında kabaca aynı yerlerde kıvırcık parantez hem çünkü Learning Perl Objects, References & Modules

kaynak gösteren derleyici Şunu ikisinden hangisi hakkında geçici tespitler yapmak zorundadır. Derleyici yanlış karar verirse, istediğiniz şeyi almak için bir ipucu vermeniz gerekebilir. Bir anonim hash yapıcı istediğiniz derleyiciyi göstermek için, açılış küme ayraçından önce bir artı işareti koyun: + {...}. Bir kod bloğu aldığınızdan emin olmak için, bloğun başlangıcında bir noktalı virgül (boş bir ifadeyi temsil eden) koyunuz: {; ...}.

Ya map fonksiyonu üzerine belgelerinden

:

"{" starts both hash references and blocks, so "map { ..." could 
be either the start of map BLOCK LIST or map EXPR, LIST. Because 
Perl doesn't look ahead for the closing "}" it has to take a guess 
at which it's dealing with based on what it finds just after the 
"{". Usually it gets it right, but if it doesn't it won't realize 
something is wrong until it gets to the "}" and encounters the 
missing (or unexpected) comma. The syntax error will be reported 
close to the "}", but you'll need to change something near the "{" 
such as using a unary "+" or semicolon to give Perl some help: 

    %hash = map { "\L$_" => 1 } @array # perl guesses EXPR. wrong 
    %hash = map { +"\L$_" => 1 } @array # perl guesses BLOCK. right 
    %hash = map {; "\L$_" => 1 } @array # this also works 
    %hash = map { ("\L$_" => 1) } @array # as does this 
    %hash = map { lc($_) => 1 } @array # and this. 
    %hash = map +(lc($_) => 1), @array # this is EXPR and works! 

    %hash = map (lc($_), 1), @array # evaluates to (1, @array) 

or to force an anon hash constructor use "+{": 

    @hashes = map +{ lc($_) => 1 }, @array # EXPR, so needs 
              # comma at end 

to get a list of anonymous hashes each with only one entry apiece. 
+0

tarafından o çalıştırılabilir yapılan dokümantasyon? "Perl" + {} "ve" perl "+ {...}" veya "perl plus sign hash" 'yi gözetlemeye çalıştım. Uygun bir şey bulamadım. Sihir numaran nedir? – nowox

+2

"Harita" dokümantasyonunu okuduğumu biliyorum "http://perldoc.perl.org/functions/map.html – Sobrique

+0

" perl hash plus sign "dosyasına girdim ve ilk hit olarak bağlantıyı aldım. – Matteo

İlgili konular