perl - 在连接 (.) 或字符串中使用未初始化的值 $2

标签 perl

我将我的网站转移到另一台服务器上,发生了这个错误:

珀尔:
在/Toolbox.pm 第 40 行的连接 (.) 或字符串中使用未初始化的值 $2。

功能 :

36 sub WT_filter{
37 
38    my $filter = sub {
39         my $text_ref = shift;
40         $$text_ref =~ s/\[\%([^ ]+?)( .*)?\%\]/<TMPL_VAR NAME=\"$1\"$2>/g;
41    };
42
43    return $filter;
44
45 } #sub WT_filter

谢谢 !

最佳答案

你有正则表达式 /\[\%([^ ]+?)( .*)?\%\]/ .或者写得更易读:

/
  \[\%
  ( [^ ]+? )  # $1
  ( [ ].* )?    # $2
  \%\]
/x

您可能会注意到 $2 -group 是完全可选的。如果 $2 的模式不匹配,它将被设置为 undef .如果变量名和结束 %] 之间没有至少一个空格,则不匹配。 : [%foo-bar%] .

可能的解决方案包括:
  • 更改 $2 的模式这样它也接受零长度字符串:( .* )
  • 使用 $2 的默认值插值前:
    s{\[\%([^ ]+?)( .*)?\%\]}{qq[<TMPL_VAR NAME="$1"] . ($2 // q[]) . q[>]}eg
    

    (只能从 perl 5.10 开始工作)
  • 在过滤器范围内关闭此警告:no warnings'uninitialized'; .

  • 请注意,您的替换机制容易受到 XML 注入(inject)的影响,并且当变量 [% … %] 时会出现问题。 block 被拉伸(stretch)到多行,或者当两个变量在同一行时。假设 escape()转义一些数据以便在 XML 中安全使用,那么以下应该可以工作:
    s{
      \[%
      (\S+?)  # $1 is a sequence of non-space characters
      (?: \s+ ["]([^"]+)["] )?  # $2 is anything inside double quotes
      %\]
    }{
      (defined $2)
      ? (sprintf q[<TMPL_VAR NAME="%s" "%s">], escape($1), escape($2))
      : (sprintf q[<TMPL_VAR NAME="%s">], escape($1))
    }gsex
    

    关于perl - 在连接 (.) 或字符串中使用未初始化的值 $2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25092401/

    相关文章:

    perl - 如何在用于打开的命令中使用变量以及 (-|) 管道输出,其中文件名被解释为通过管道输出给我们的命令

    perl - Perl 中的数组数组

    perl - 密码中的特殊字符导致 Mojolicious UA 中的基本身份验证失败

    java - Delphi 中有哈希数组吗?

    perl - 如何在 Perl 中打印源代码行号?

    perl - 如何使用 B::Concise 为所有函数转储操作

    Perl unicode 哈希键查找

    Perl,如何创建类似子程序的 map/grep?

    linux - Linux bash 脚本中的 Perl 脚本

    perl - 当方法是 CODEREF 时,继承如何工作?