我在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;
}
Run Code Online (Sandbox Code Playgroud)
其中$old = $*; $* =1;并$* = $old;给出了不再支持$*的错误.什么应该是这两条线的替代品.我不知道perl.
要获得有关警告消息的更详细说明, use diagnostics;
(D弃用,语法)从旧的perls中弃用的特殊变量$*自5.9.0起已被删除,不再受支持.在以前版本的perl中,在字符串中使用$*启用或禁用多行匹配.
而不是使用$*你应该使用/ m(和可能/ s)regexp修饰符.您可以使用re'/ m'为词法范围(甚至整个文件)启用/ m.(在旧版本中:当$*设置为true值时,所有正则表达式都表现得好像是使用/ m编写的.)
伙计,这是一些古老的代码.它似乎早于词汇变量,这意味着它是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;
}
Run Code Online (Sandbox Code Playgroud)
它应该全局打开/m正则表达式标志.但该代码使用的唯一正则表达式不包含受其影响的任何内容/m.
来自perlvar:
$*是一个可用于启用多行匹配的变量.在弃用周期之后,其魔力在Perl v5.10.0中被删除.现在使用它会触发警告:"不再支持$*".您应该使用"/ s"和"/ m"regexp修饰符.在Perl 5中弃用.
换句话说,该脚本是古老的,充满了不好的做法(即使是时间),以及-最糟糕的是-没有必要为多匹配所有.
只需删除所有引用的行$*,它应该仍然有效.否则,将/m修饰符添加到该区域中的所有正则表达式.