我将我的网站转移到另一台服务器上,发生了这个错误:
珀尔:
在/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/