2009-09-29 10 views
5

Tôi đang lặp qua danh sách các liên kết trên một trang, tạo đối tượng URI cho mỗi trang. Khi đối tượng URI được tạo ra, tôi không biết liệu URL có một chương trình, vì vậy khi sau đó tôi gọi $uri->host(), tôi sẽ thỉnh thoảng có đượcLàm cách nào để kiểm tra xem tôi có thể gọi máy chủ lưu trữ() trên đối tượng URI trong Perl không?

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

vì đối tượng URI là loại URI::_generic, và doesn không có thuộc tính host().

Tôi có thể kiểm tra trước khi tạo đối tượng với regex, hoặc tôi có thể kết thúc cuộc gọi $uri->host() trong khối eval để xử lý ngoại lệ, nhưng tôi cho rằng phải có phương pháp suave hơn một trong số đó.

Trả lời

13

Đề xuất của tôi: sử dụng các tính năng ngôn ngữ được tích hợp trước lợi thế của bạn trước regex.

Thay vì một regex, bạn có thể làm điều này:

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

... để xem nếu nó có sẵn. Bạn cũng có thể kiểm tra loại của nó:

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

... và xác minh rằng bạn có một tài khoản phù hợp.

+1

Tôi chưa bao giờ biết về phương thức -> can() cho các đối tượng, cảm ơn! –

+0

Bạn đã có cuộc gọi 'trong cuộc nói của bạn' chưa từng có. – Ether

4

Lớp UNIVERSAL (perldoc UNIVERSAL) thực sự hữu ích; nó chứa:

  • $obj->can(METHOD), để xác định nếu PHƯƠNG PHÁP có sẵn trên lớp $ obj (hoặc bạn có thể sử dụng một classname trần chứ không phải là một đối tượng may mắn - được sử dụng cho duck typing

  • $obj->isa(TYPE), để xác định! nếu $ obj là loại TYPE hoặc là hậu duệ của TYPE (về cơ bản, hãy kiểm tra xem ref ($ obj) có nằm trong mảng @ISA của TYPE) hay không - được sử dụng cho một số triển khai đa hình

  • VERSION, để nhận chuỗi phiên bản của mô-đun (boorrrrring)

Các vấn đề liên quan