2010-02-04 33 views
6

Perl modülü için bir referans referans çalışması nasıl yapılacağını anlamaya çalışıyorum. Bir modülün dışında nasıl yapılacağını biliyorum ama bir tanesinin içinde mi? Bu gibi bir kod düşünün:Perl modülünde bir işlev referansı nasıl yazılır?

==mymodule.pm== 
1 sub foo { my $self = shift; ... } 
2 sub bar { my $self = shift; ... } 
3 sub zip { 
4 my $self = shift; 
5 my $ref = \&foo; 
6 $self->&$foo(); # what syntax is appropriate? 
7 } 
==eof=== 

Yukarıdaki 5-6 numaralı satırlara bakın. (1) fonksiyon referansını ilk sırada tanımlamak ve (2) bunu iptal etmek için doğru sözdizimi nedir?

cevap

8

$ref Bir yöntem (ilk argüman olarak $self beklediğini) ise ve senin $self üzerine aramak istediğiniz, sözdizimi: Bir fonksiyon referans tanımlama

$self->$ref(@args) 
+1

bu çağrı tarzında nota önemli şey $ self' olduğunu 'olmasıdır kullanmak hangi yöntemin kullanılacağını belirlemek için kullanılmaz (genellikle OO tarzı bir yöntem çağrılırken olduğu gibi) - yöntem yalnızca "$ ref" değerinden belirlenir ve $ $ öz değeri sadece $ ref ilk argümanı olarak geçirilir. Bunu '$ ref' basitçe bir yöntemin adıysa, bu durumda karşımıza çıkar, bu durumda bu yöntemi "$ self" ve daha sonra kalıtım ağacında aramaya başlarız. – Ether

+0

Randal "one-L" Schwartz olduğu için terfi! Yuppi! –

+8

@Jonathan: Bir grup salya veren gruba SO (perl) getirmeyelim. Jon Skeet fanboları yeterince kötü. :/ – Ether

20

TMTOWTDI

:

$ref = \&subroutine; 
$ref = sub { BLOCK }; 
$ref = "subroutineName"; # or $ref = $scalarSubroutineName 

başvurusu kaldırıldığında:

$ref->(@args); 
&$ref; 
&{$ref}(@args); 
6

aşağıdaki kullanım: Bu sözdizimi ile

$self->$ref(); 

, $ref, örneğin aramak için yöntemin adı ile bir alt yordam bir referans ya da bir dizi olabilir,

my $ref = "foo"; 
$self->$ref(); 

iki miras bakımından biraz farklı anlamlara sahip olduğunu unutmayın.

müstehcen argümanları geçmezken, parantezler isteğe bağlıdır: Aksi

$self->$ref; # also flies 

,

$self->$ref($arg1, \%arg2, @others); 
İlgili konular