$ *不受支持

时间:2014-01-30 22:27:05

标签: perl

我在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。

3 个答案:

答案 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修饰符添加到该区域中的所有正则表达式。