2014-01-30 89 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