2012-03-02 124 views
5

我有一個腳本應該能夠對具有不同IP地址的服務進行一些調用。我的代碼工作時,我沒有設置任何IP到我的電話,我寫了一個函數調用做之前分配一個IP對象,但它返回一個錯誤:爲什麼我不能爲LWP :: UserAgent分配一個IP?

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

這是我的功能結構:

#!/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(); 
} 

這是我給他們打電話的方式:

set_caller_ip($caller_ip_address); 

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

你知道有什麼問題?

感謝您的幫助提前!

回答

8

local_address屬性添加到LWP::UserAgent版本5.834。你可以使用舊版本嗎?

嘗試:

use LWP::UserAgent 5.834; # need local_address 

(每當我指定一個模塊的最小版本,我嘗試添加一個簡短的評論,解釋爲什麼這是最低版本。)

+0

感謝您的提示!這真的可能!讓我檢查版本! – Monica 2012-03-02 23:26:27

+0

你是絕對正確的......謝謝你!我在這個問題上掙扎了3個小時......而實際上我不是系統管理員,所以現在我應該學習如何升級這個模塊!無論如何...感謝您的幫助:) – Monica 2012-03-02 23:31:32

+1

@Monica,當你看到'無法找到對象方法'消息時,基本上有3個選項:你拼錯方法名稱,你有錯誤的對象類型,或者該模塊的版本與您正在閱讀的文檔(以及API已更改)不匹配。 – cjm 2012-03-02 23:34:48

1

@cjm已經回答了這個問題關於您的錯誤,但注意LWP :: UserAgent舊版本的替代方案可能會很有用。

LWP :: Protocol :: http有一個un-(或至少under-)記錄的功能,可以讓你設置「額外套接字選項」。我(使用5.824)在我的代碼這樣做,和它的作品:

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

在LWP /協議相同的代碼/ http.pm似乎也存在在一個用Perl 5.8安裝了一個更古老的LWP舊的RHEL4系統,所以它已經過了一段時間...... :-)

相關問題