2012-03-02 13 views
5

Tôi có một tập lệnh có thể thực hiện một số cuộc gọi đến một dịch vụ với các địa chỉ IP khác nhau. Mã của tôi hoạt động khi tôi không đặt bất kỳ ip cho các cuộc gọi của tôi, tôi đã viết một hàm để gán một địa chỉ IP cho các đối tượng trước khi thực hiện cuộc gọi, nhưng nó sẽ trả về một lỗi:Tại sao tôi không thể gán ip cho LWP :: UserAgent?

Can't locate object method "local_address" via package "LWP::UserAgent" 

Đây là cấu trúc chức năng của tôi:

#!/usr/bin/perl -w 

use LWP::UserAgent; 
use HTTP::Headers; 
use HTTP::Request::Common; 
use HTTP::Cookies; 
use URI::Escape; 
use HTML::LinkExtor; 

# set user agent object values 
my $ua = new LWP::UserAgent; 
$ua->agent('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6'); 
push @{ $ua->requests_redirectable }, 'POST'; 
$ua->cookie_jar({}); 


sub set_caller_ip { 
    my($set_ip_address) = @_; 

    $ua->local_address("$set_ip_address"); 
    return 1; 
} 


sub test_caller_ip { 

    my $req = new HTTP::Request('GET', 'http://whatismyip.org/'); 
    $req->headers->push_header('Connection','Keep-Alive'); 
    $req->headers->push_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'); 
    my $res = $ua->request($req) or die "$!"; 

    return $res->content(); 
} 

Và đây là cách mà tôi gọi họ là:

set_caller_ip($caller_ip_address); 

$caller_ip_tested = test_caller_ip(); 
print "\$caller_ip_tested=".$caller_ip_tested."\n";die; 

bạn có biết vấn đề là gì ?!

Cảm ơn sự giúp đỡ của bạn trước!

Trả lời

8

Thuộc tính local_address đã được thêm vào LWP::UserAgent phiên bản 5.834. Bạn có thể sử dụng phiên bản cũ hơn không?

Hãy thử:

use LWP::UserAgent 5.834; # need local_address 

(Bất cứ khi nào tôi chỉ định một phiên bản tối thiểu cho một mô-đun, tôi cố gắng thêm một lời nhận xét ngắn gọn giải thích tại sao đó là phiên bản tối thiểu.)

+0

nhờ gợi ý! điều đó thực sự có thể !!! hãy để tôi kiểm tra phiên bản! – Monica

+0

bạn hoàn toàn đúng ... Cảm ơn người đàn ông! Tôi đã đấu tranh với vấn đề này trong 3 giờ ... Và thực ra tôi không phải là quản trị viên của sys nên bây giờ tôi nên học cách nâng cấp mô-đun này !!! anyway ... cảm ơn sự giúp đỡ của bạn :) – Monica

+1

@Monica, khi bạn thấy thông báo 'Không thể định vị đối tượng phương thức', về cơ bản có 3 tùy chọn: bạn đã viết sai chính tả tên phương thức, bạn đã có loại đối tượng sai hoặc phiên bản của mô-đun không khớp với tài liệu bạn đang đọc (và API đã thay đổi). – cjm

1

@cjm đã trả lời câu hỏi về lỗi của bạn, nhưng có thể hữu ích khi lưu ý thay thế cho các phiên bản cũ hơn của LWP :: UserAgent.

Có một tính năng chưa được ghi (hoặc ít nhất là dưới) của LWP :: Protocol :: http cho phép bạn đặt "tùy chọn ổ cắm bổ sung". Tôi đang làm điều này trong mã của tôi (sử dụng 5,824), và nó hoạt động:

@LWP::Protocol::http::EXTRA_SOCK_OPTS = { LocalAddr => "10.11.12.13" }; 

Cùng mã trong LWP/Protocol/http.pm dường như cũng tồn tại trong một LWP cũ nhiều cài đặt với perl 5,8 trên hệ thống RHEL4 cũ, vì vậy nó đã được khoảng một thời gian ... :-)