2009-12-03 17 views
7

İşte elde etmek istediğim bu:Bir altprogramı nasıl yeniden tanımlayabilirim ve eski olanı nasıl saklayabilirim?

sub first { 
    print "this is original first"; 
} 

*original_first = \&first; 

sub first { 
    print "this is first redefined"; 
} 

original_first(); # i expect this to print "this is original first" 
first() # i expect this to print "this is first redefined" 
Ben first için sembol kaydederek, daha sonra (isim original_first altında) orijinal alt yordamı çağırmak mümkün olurdu ve ayrıca muktedir olduğu düşünülmektedir

first'u aramak ve yeniden tanımlanmış olanı al. Bununla birlikte, original_first numaralı telefonu ararsam, "bu ilk olarak yeniden tanımlanır" ı almaya devam ediyorum. Bu işi yapmak için ne yapmam gerekiyor?

cevap

9

beklediğiniz gibi bu çalışması gerekir: kopyasını kaydetmeden önce oluyor &first sonuna kadar

BEGIN { 
    *first = sub { ... } 
} 

böylece hem atamaları: Kodunuzdaki

sub first { 
    print "this is original first"; 
} 

*original_first = \&first; 

*first = sub { 
    print "this is first redefined"; 
}; 
+0

'İlk' sembolünü yeniden tanımladığınızda, yalnızca kod bölümünü etkilemek mümkün mü? – Geo

+5

bir kodekin (alt {...} tarafından oluşturulan) bir tipgloba atanması, yalnızca CODE girişini globda değiştirecektir. glob'deki diğer veri türleri –

+4

değiştirmez. Ayrıca, sadece yerel olarak fonksiyonu değiştirmek için 'local * first = sub {...};' işlevini de kullanabilirsiniz. –

9

, Perl buna benzer alt beyanları hem yorumladığı ve rutinleri çağırmak. düzeltme, bir çalışma zamanı atama içine ikinci beyanda yapmaktır:

sub first { 
    print "this is original first"; 
} 

*original_first = \&first; 

*first = sub {print "this is first redefined"}; 

original_first(); # prints "this is original first" 
first();   # prints "this is first redefined" 
+0

Güzel açıklama. Teşekkürler! Tanımladığınız "alt {}" -> "BEGIN {* ...}" davranışı için gerekli – Geo

+0

referansı. – Ether

+0

Yukarıdakileri, aşağıdaki açıklamadan perlmod'tan çıkarıyorum: Altprogram tanımları (ve bu konudaki beyanlar), sembol tablosunu kapladıkları pakette yer almaları gerekmemektedir. Paketin dışında bir alt yordamı alt yordamın ismini açıkça belirterek tanımlayabilirsiniz: 1. Paket ana; 2. alt Some_package :: foo {...} # & Some_package tanımlanan foo Bu derleme zamanında bir typeglob atama için sadece bir kısaltmadır: 1. {BEGIN * Some_package :: foo = sub {... }} –

1

sizin için tüm işleyebilir Hook::LexWrap modülü, bakınız. Modülü kullanmak istemiyorsanız, tam olarak nasıl yapacağınızı gösteren kaynağa bakın.

İlgili konular