我在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。
答案 0 :(得分:7)
要对警告消息use diagnostics;
(D不赞成,语法)特殊变量$ *,旧版本弃用 perls已从5.9.0开始删除,不再受支持。在 以前版本的perl使用$ *启用或禁用多行 在字符串中匹配。
而不是使用$ *,你应该使用/ m(和/ s)正则表达式 改性剂。您可以为词法范围启用/ m(甚至是整个文件) 使用re'/ m'。 (在旧版本中:当$ *设置为真值时 然后所有正则表达式都表现得好像是用它们编写的 /米)
答案 1 :(得分: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
影响的任何内容。
答案 2 :(得分:6)
来自perlvar
:
$*
是一个可用于启用多行匹配的变量。在弃用周期之后,其魔力在Perl v5.10.0中被删除。现在使用它会触发警告:“不再支持$ *”。您应该使用“/ s”和“/ m”regexp修饰符。在Perl 5中弃用。
换句话说,这个脚本是古老的,充满了不良做法(即使是时间),而且 - 最糟糕的是 - 根本不需要多线匹配。
只需删除引用$*
的所有行,它仍应有效。否则,将/m
修饰符添加到该区域中的所有正则表达式。