2015-07-13 8 views
6
(eğer varsa) fark tam olarak nedir

arası: Parantez içeren ve içermeyen bir Perl alt bildirimi arasındaki fark nedir?

sub foobar { 
    # doing some stuff 
} 

sub foobar() { 
    # doing some stuff 
} 

ve

Her bazılarını görmek ve ilk sözdizimi bazen derlemek için başarısız.

+6

İlki, işlevin argüman almadığını söyleyen bir prototiptir; İkincisi bir prototip değildir ve argümanlar hakkında hiçbir şey söylemez. İkinci formu kullan. [Perl'deki prototipler hakkında bilmek istediğinizden çok daha fazlası] (http://www.perlmonks.org/?node_id=861966). –

+2

'5.20' * deneysel * fonksiyon imzaları da parens kullanmaktadır, http://www.effectiveperlprogramming.com/2015/04/use-v5-20-subroutine-signatures/ –

cevap

9

Alt yordam adının sonuna () kodunu koyarak, size bir prototip veriyorsunuz. Bir prototip, Perl'e altprograma ileteceğiniz argümanların sayısı ve türleri hakkında ipuçları verir. Detaylar için bakınız this section in perlsub.

Özellikle, (), bu alt yordamın hiçbir argüman almadığını Perl'e söyleyen boş prototiptir ve bu alt yordamı argümanlarla çağırırsanız Perl bir derleme hatası atar. Bundan

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

sub foo { 
    say 'In foo'; 
} 

sub bar() { 
    say 'In bar'; 
} 

foo(); 
bar(); 
foo(1); 
bar(1); 

çıkışı:

Too many arguments for main::bar at ./foobar line 18, near "1)" 
Execution of ./foobar aborted due to compilation errors. 

Bu hataya neden bar() bu son çağrı (1 argümanla bir) var İşte bir örnek. Perl'in prototiplerin uygulanmasının genellikle insanların sıklıkla düşündükleri ve birkaç özel durumun dışında çoğu Perl uzmanının bunları önleyeceği kadar yararlı olmadığı dikkate alınmalıdır. Ben de aynısını yapmanı öneririm. Perl v5.22'den itibaren, deneysel "imzalar" özelliği, diğer dillerden gelen programcıların prototiplerden beklediği pek çok hedefe ulaşmayı umuyor.

+0

" argümanların sayısı ve türleri ile ilgili ipuçları " Birileri senaryosunu okursanız değerli bir bilgi. Bu ipuçlarını kodun içine koymaya değmez mi? Neden çoğu insanın bundan kaçtığını söyleyebilir misin? – Matthias

+4

Tom Christiansen [yazdı] (http://www.perlmonks.org/?node_id=861966) elimden çok daha iyi. –

+1

@Matthias Eğer T.C. P.M. post TL, DR, perl dizisi ve karma tipleri ile ilgili belirsizlikleri düşünebilirsiniz; foo ($ a, $ b) '' foo (@args) ', vb. olabilir. Dünya bundan sonra iki kampa bölünür, insanlar korkudan kaçacak ve dilden uzak kalacaklardır. yapabilirler ve bunu bir deha ya da şans eseri olarak gören insanlar. Ayrıca, iyi kurulmuş bir belge stiline (POD) sahip bir dil olduğunu ve bu durumun ** dinamik olarak yazılmış ** bir dil için uygun bir sorumluluklar ayrılığı * olabileceğini unutmayın. – delicateLatticeworkFever

İlgili konular