假设我必须使用单个替换来执行此替换,那么避免此错误的首选方法是什么:
Use of uninitialized value $2 in concatenation (.) or string at -e line 1.
With this Perl code:
perl -e 'use strict;use warnings;my $str="a";$str=~s/(a)|(b)/$1foo$2/gsmo;'
这里的目标是根据 $str
包含的内容打印“afoo”或“foob”。
我可以使用no warnings;
,但我担心我会错过其他“真正的”警告。我也知道使用一种模式会使事情变得复杂,但我的实际模式要复杂得多。
如果您关心,实际替换更接近:
#!perl
my $search = q~(document\.domain.*?</script>)|(</head>)~;
my $search_re = qr/$search/smo;
my $replace = q("$1
<script src=\"/library.js\"></script>
$2");
while (<*.tmpl>) {
my $str = fead_file($_);
$str =~ s/$search_re/$replace/gee;
}
但更复杂的是,基本上上面的代码只是从数据库读取以获取搜索和替换,然后对模板执行它们。每次提交都必须运行这个脚本两次,显然会带来太多的开销……他们是这么说的……
最佳答案
你可以:
my $replace = q("@{[$1||'']}
<script src=\"/library.js\"></script>
@{[$2||'']}");
(在 5.10+ 上使用//代替 ||)
关于regex - 替换中未初始化的反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6914629/