2016-09-26 1 views

답변

1

WWW::Mechanizeonerror 콜백 즉 잉어 :: 죽이다 같은 다이 호환 기능을

  • 의 OnError => FUNC & \
    참조 에러 응답을 제공하는 것을 의미 치명적인 오류가 발생하면 호출됩니다.

이것은 생성되는 대상의 복구 또는 사용을위한 것이 아닙니다.

즉, onerror에 전화를 걸어 왔지만 그 대상에 대해 알 수는 없습니다.

use warnings; 
use strict; 
use feature 'say'; 

use WWW::Mechanize; 

my $mech = new WWW::Mechanize(onerror => \&mecherror); 
$mech->get("http://stackoverflow.comxxxx"); 
say $mech->content; 

sub mecherror { 
    my $response = $mech->get("http://stackoverflow.com"); 
    # say $mech->content; 
    say "response is " . ref($response); 
    say $response->decoded_content; 
} 

이는 우리가 HTTP::Response 개체를 정식으로 얻었으며 페이지를 인쇄 함을 나타냅니다. 그런 다음 콜백에 대한 참조를 전달하여 호출 코드에 연결할 수 있기를 바랍니다. 그러나 이것에 대한 메커니즘은 제공되지 않습니다. 이것은 지원되지 않습니다. 우리는 인데 내부에 얽매이지 않도록 경고했습니다.

개체가 업데이트되지 않는 이유는 콜백 구현에 따라 다릅니다. source code에서 우리는 코드 참조가 개체의 데이터로 전환되고 래퍼

sub die { 
    my $self = shift; 
    return unless my $handler = $self->{onerror}; 
    return $handler->(@_); 
} 

이 트리거 할 때 다른 코드의 많은이 참여를 통해 필요할 때 아무 것도 객체의 상태를 변경하려면 여기를 수행되지 않습니다 동안 실행되는 것을 알 수있다. 그것은 단지 지원되지 않으며 정의되지 않은 동작을 초래할 수 있습니다.

여기서 콜백은 글로벌이기 때문에 $mech이 무엇인지 알고 있으므로 올바른 개체를 가지고 있습니다.


주석을 토대로 요약하면, 콜백으로 검색 한 페이지는 오류 메시지로 덮어 쓰게됩니다. decoded_content 방법은 LWP::UserAgent를 통해 상속, HTTP::Response에서, 그리고 오류 메시지가 참으로 보인다

$content = $self->response()->decoded_content(charset => 'none'); 

(소스 참조) content를 호출 할 때 우리는이를 볼 수 있습니다, 그리고 방법의이 부분에 의한 것으로 보인다 그 반에서 나왔다. (W M도 LWP 어느 :: :: UA라는 방법이 "decode_content을.")이

$mech->content(...)
은 기계화가 가져온 마지막 페이지에 대해 내부적으로 사용하는 내용을 반환 W::M::content 페이지에 요약되어 있습니다. 일반적으로 이것은 $mech->response()->decoded_content(), [...]

과 동일하지만, 논의 된 것처럼 일관성있는 상태에있는 개체를 사용하는 것은 불가능합니다.

+0

그러나 개체가 생성 된 후에 콜백이 제대로 실행되므로 이해가되지 않습니다. – CJ7

+0

@ CJ7 이것은 onerror 내부의 호출에 관한 것으로 페이지가 성공적으로 검색됩니다. 그것이 언제 실행되는지 - 어떻게 구현되는지는 알 수 없습니다. '$ mech'는 그 내용을 얻지 못한다는 것을 제외하고. 방금 시도한 - 나쁜 호출을 제거하고 그냥 '새로운'바로 뒤에 내용을 인쇄하십시오. 그것은 초기화되지 않았습니다. – zdim

+0

나쁜 호출을 제거하면'onerror'는 확실히 호출되지 않으므로 어떤 일이 발생할 것으로 예상됩니까? – CJ7

관련 문제