2014-01-30 112 views
0

我在Perl代碼:

sub PrintVariables { 
    local (%in) = @_; 
    local ($old, $out, $output); 
    $old = $*; $* =1; 


$output .= "<DL COMPACT>"; 
    foreach $key (sort keys(%in)) { 
    foreach (split("\0", $in{$key})) { 
     ($out = $_) =~ s/\n/<BR>/g; 
     $output .= "<B> $key = </B>$out <BR>"; 
    } 
    } 
    $output .= "</DL>"; 
    $* = $old; 
    return $output; 
} 

其中$old = $*; $* =1;$* = $old;給出錯誤$ *不再支持。這兩條線應該取代什麼?我不知道perl。

回答

7

人,這是一些古老的代碼。它似乎早於詞法變量,這意味着它是Perl 4代碼。

在這種情況下,$*實際上並沒有做任何事情。只要刪除它。

sub PrintVariables { 
    local (%in) = @_; 
    local ($out, $output); 

    $output .= "<DL COMPACT>"; 
    foreach $key (sort keys(%in)) { 
    foreach (split("\0", $in{$key})) { 
     ($out = $_) =~ s/\n/<BR>/g; 
     $output .= "<B> $key = </B>$out <BR>"; 
    } 
    } 
    $output .= "</DL>"; 
    return $output; 
} 

它應該全局打開/m正則表達式標誌。但是該代碼使用的唯一正則表達式不包含任何受到/m影響的內容。

+0

底線,我只需要刪除這兩行是? – debonair

+0

在這種情況下,是的。對於當前的代碼,它們不是必需的。很可能以前的版本使用了不同的正則表達式。當有人改變正則表達式以便多行匹配不再相關時,他們忘記刪除'$ *'位。 – cjm

+0

好的,謝謝,將檢查它 – debonair

7

要獲得相關的警告消息更詳細的解釋,use diagnostics;

(d過時,語法)特殊變量$ *,中老年 皮爾斯過時,已被刪除爲5.9.0,並不再支持。在 以前的版本中perl使用$ *啓用或禁用多行 在一個字符串內匹配。

而不是使用$ *,您應該使用/ m(和可能是/ s)regexp 修飾符。您可以啓用/ m作爲詞法作用域(即使是整個文件) ,使用'/ m'。 (在舊版本:當$ *設置爲true值 則表現好像是用 /平方米編寫的所有正則表達式)

6

perlvar

$*是,你可以用它來實現多行匹配的變量。在棄用循環之後,它的魔法在Perl v5.10.0中被刪除。現在使用它會觸發警告:「不再支持$ *」。您應該使用「/ s」和「/ m」正則表達式修飾符。

棄用在Perl 5

換句話說,該腳本是古老的,充滿了不好的做法(即使是時間),以及 - 最糟糕的是 - 沒有必要多在匹配全部爲

只要刪除所有涉及$*的行,它應該仍然有效。否則,請將/m修飾符添加到該區域中的所有正則表達式。

+2

「它應該仍然有效」...因爲該模式既不使用「^」也不使用「$」,這是受/ m影響的唯一兩件事情。 – ikegami