2009-09-29 4 views
5

페이지의 링크 목록을 반복하면서 각 URI 객체를 만듭니다. URI를 객체가 생성 될 때, 나는 URL는 계획을 가지고 있는지 모르는, 그래서 나중에 $uri->host()를 호출 할 때 URI 객체 유형 URI::_generic의 때문에, 가끔Perl의 URI 객체에서 host()를 호출 할 수 있는지 어떻게 확인할 수 있습니까?

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

을 얻을 것이고, 아무튼 host() 속성이 없습니다.

정규식을 사용하여 객체를 생성하기 전에 확인할 수 있습니다. 또는 $uri->host() 호출을 eval 블록으로 래핑하여 예외를 처리 할 수 ​​있지만 그 중 하나보다 더 좋은 방법이 있어야합니다.

답변

13

내 제안 : 정규식을 사용하기 전에 내장 된 언어 기능을 사용하십시오. 대신 정규식의

, 당신은이 작업을 수행 할 수 있습니다 : 그것은 가능한 경우

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

는 ... 볼 수 있습니다. 유형을 확인해 볼 수도 있습니다.

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

... 당신이 좋은 것을 가지고 있는지 확인하십시오.

+1

개체에 대해 can() 메서드를 알지 못했습니다. 감사합니다! –

+0

당신은 당신의 say() 전화에서 타의 추종을 불허합니다. – Ether

4

UNIVERSAL 클래스 (perldoc UNIVERSAL)는 참으로 유용합니다. 방법은 $의 OBJ 클래스에 사용할 수 있는지 결정하기 위해,

  • $obj->can(METHOD)을 (또는 당신은 베어 클래스 명보다는 축복 개체를 사용할 수 있습니다 - 결정, duck typing에 사용

  • $obj->isa(TYPE)을 : 그것은 포함! $ obj가 TYPE 유형이거나 TYPE의 자손 인 경우 (본질적으로 ref ($ obj)가 TYPE의 @ISA 배열에 있는지 확인) (베어 클래스 이름도 허용됨) - 일부 다형성 구현에 사용됨

  • VERSION 모듈의 버전 문자열 (boorrrring)

관련 문제