2015-03-02 76 views
0

我有一個子程序在第一次調用時工作,但第二次時,如果URL無效,它使用前一個值$1。有沒有簡單的方法來休息$1的值或等於NULL值?

編輯:這是我的代碼

our %hash; 
sub GetOnce{ 
    $mech->get($_[0]); 
    $val = $mech->content; 
    $val =~ /value="(.*?)"/; 
    if($1 ne "") {$hash{$_[1]} = $1;} 
} 
GetNonce("http://URL1", "VAR1"); #Valid URL 
GetNonce("http://URL2", "VAR2"); #Timesout 

我只是想重置錯誤處理的值。即如果URL1有效,但URL2無效或超時,那麼$1對於它們都是相同的。如果URL1無效/超時並且URL2有效,則僅保存來自URL2的$ 1。如果它們都是有效的,那麼程序存儲它們的每個$ 1。

+1

你不測試,如果你的對手是成功還是失敗? – tadman 2015-03-02 21:31:05

+0

請寄一點樣品代碼。一般來說,如果你有正面的模式匹配結果,你只應該訪問1美元。 – daotoad 2015-03-02 21:35:13

+0

通常你會這樣做:'如果m/foo(bar)/;'(用你操作'$ 1'的任何操作來代替'print'),打印$ 1 – ThisSuitIsBlackNot 2015-03-02 21:36:47

回答

5

我建議不使用$1,而是:

my ($match) = ($val =~ m/value="(.*?)"/); 

模式匹配這樣的有用的功能 - 在一個標量上下文中,這是一個「真/假」,但在列表環境,它返回比賽列表。您可以將其分配給單個標量。

因此,無論如何 - $matchundef如果比賽失敗,並且無論是在比賽,如果它的工作。儘管如此,如果$match的值爲0'',那麼它應該使用defined來測試這一點,儘管它已經工作,但它將評估爲錯誤。

例如爲:

our %hash; 
sub GetOnce{ 
    my ($url, $key) = @_; 
    $mech->get($url); 
    my ($match) = ($mech -> content =~ m/value="(.*?)"/); 
    #may not need to test it - you could just have an undef value. 
    if (defined $match) { $hash{$key} = $match }; 
} 
+0

你的代碼提供了相同的輸出,但是我發現原因......我移動了'$ mech '開始子程序 – Bijan 2015-03-02 22:11:31

3

應測試正則表達式匹配本身,而不是捕獲的價值。這也是名稱@_中的值,並且在您的正則表達式中使用補充字符類而不是非貪婪匹配。

像這樣

our %hash; 

sub get_once { 
    my ($url, $key) = @_; 
    $mech->get($url); 
    my $content = $mech->content; 
    $hash{$key} = $1 if $content =~ /value="([^"]*)"/; 
}