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

Wiw*_*ild 3 perl

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

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

功能 :

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
Run Code Online (Sandbox Code Playgroud)

谢谢 !

amo*_*mon 8

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

/
  \[\%
  ( [^ ]+? )  # $1
  ( [ ].* )?    # $2
  \%\]
/x
Run Code Online (Sandbox Code Playgroud)

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

可能的方案包括:

  • 更改模式,$2以便它也接受零长度字符串:( .* )

  • 使用$2插值前的默认值:

    s{\[\%([^ ]+?)( .*)?\%\]}{qq[<TMPL_VAR NAME="$1"] . ($2 // q[]) . q[>]}eg
    
    Run Code Online (Sandbox Code Playgroud)

    (仅从perl 5.10开始工作)

  • 在过滤器范围内关闭此警告:no warnings'uninitialized';.

请注意,您的替换机制容易受到XML注入的影响,并且当变量[% … %]块在多行上延伸时,或者当两个变量在同一行上时会出现问题.假设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
Run Code Online (Sandbox Code Playgroud)