2009-09-29 17 views
5

Her sayfada bir URI nesnesi oluşturarak, bir sayfadaki bağlantıların listesini yineliyorum. URI nesnesi oluşturulduğunda, ben URL bir şema olup olmadığını bilmiyorum, bu yüzden daha sonra $uri->host() çağırdığınızda URI nesne türü URI::_generic ait olduğu için, bazenPerl'de bir URI nesnesinde host() öğesini çağırabilirmiyim nasıl kontrol edebilirim?

Can't locate object method "host" via package "URI::_generic" at -e line 1.

alacak ve gelmez host() özelliğiniz yok.

Nesne oluşturma işleminden önce düzenli ifadeyle kontrol edebilirim veya istisnai işlemleri gerçekleştirmek için $uri->host() aramasını eval blokta doldurabilirdim, ancak bunların her ikisinden de daha iyi bir yöntem olması gerektiğini düşünüyorum.

cevap

13

Benim önerim: Bir regex önce sizin yararınıza dil özellikleri yerleşik kullanın. Bunun yerine bir regex ait

, bunu yapabilirsiniz: Sunulursa,

if ($uri->can('host')) { 
    say "We're good!"; 
} 

... görmeye. Ayrıca 's türünü kontrol edebilir:

if ($uri->isa('URI::_generic')) { 
    die 'A generic type - not good!' ; 
} 

... ve iyi birine sahip olduğundan emin olun.

+1

Nesneler için -> can() yöntemini asla bilmedim, teşekkürler! –

+0

Say() çağrınızda eşi benzeri olmayan bir tane var. – Ether

4

EVRENSEL sınıfı (perldoc UNIVERSAL) gerçekten de çok yararlıdır; YÖNTEM $ obj sınıfına geçerli olup olmadığının belirlenmesi için,

  • $obj->can(METHOD) (veya çıplak sınıfadı ziyade mübarek nesne kullanabilirsiniz - belirlemeye yönelik, duck typing için kullanılan

  • $obj->isa(TYPE): İçerdiği! $ nesne türü: TYPE veya tÜRÜ soyundan ise (aslında, ref ($ obj) typenin @ISA dizide ise çekler) (çıplak sınıfadı de izin) - bir almak için, bazı polimorfik uygulamalarda

  • VERSION için kullanılan modülün sürüm dizesi (boorrrrring)