我正在尝试修复一个非常旧的脚本,该脚本试图找到一个字符串FILE_DESC_LIMIT
在文本文件中并将其更改为其他内容。
为此,我当前的脚本在 Perl 5.10 上运行良好,我发现它使用了正则表达式
qr!^FILE_DESC_LIMIT=\d+(\s*)!;
但这在 Perl 5.16 中不起作用,所以我尝试打印这个表达式。
在 5.10 中我看到
(?-xism:\bFILE_DESC_LIMIT=\d+(\s*))
在 Perl 5.16 中我看到
(?^:^FILE_DESC_LIMIT=\d+(\s*))
I see qr
正在添加-xism
虽然5.16中没有添加,但为什么这里有差异呢?
如果我在正则表达式中明确添加它,它就会起作用。但我怀疑这个解决方案,因为 Perl 没有明确添加它,这里可能存在一些问题。
对于 Perl 5.16,我应该使用一些不同的方法吗?
为什么 Perl 改变了这种行为?
我的代码如下所示,我们正在创建一个正则表达式,然后使用正则表达式制定一个表达式,然后在打开的文件上求值,然后将求值的输出写入同一文件。
my atempRegex=qr!^FILE_DESC_LIMIT=\d+(\s*)!;
my $replaceSting => qq!FILE_DESC_LIMIT=$FileDescLimit\$1!
$tempRegex =~ s!\^!\\b!g if ($] =~ /5\.010/);
my $code .= "\$File =~ s!$tempRegex!$replaceSting!gsm;\n";
open (FH, "<$WORKING_DIR/$base_script_name.$$.tmp") || logWrite2(E,"--
ERROR: Unable to open $WORKING_DIR/$base_script_name.$$.tmp for reading
($!)");
my $File = join("",<FH>);
close (FH);
eval $code;
open (FH, ">$WORKING_DIR/$base_script_name.$$.tmp") || logWrite2(E,"--
ERROR: Unable to open $WORKING_DIR/$base_script_name.$$.tmp for writing
($!)");
print FH $File;
close (FH);
为了使其在 Perl 5.16 中工作,我所做的更改是,我将 -xism 修饰符显式添加到正则表达式中,并修改了 \b 修饰符条件
my $FileDescLimit=2048;
my $tempRegex=qr!^FILE_DESC_LIMIT=\d+(\s*)!;
my $replaceSting => qq!FILE_DESC_LIMIT=$FileDescLimit\$1!
if ($] >=5.016)
{
$tempRegex=~ s!\^!-xism!;
}
$tempRegex =~ s!\^!\\b!g if ($] >=5.010);
my $code .= "\$File =~ s!$tempRegex!$replaceSting!gsm;\n";
open (FH, "<$WORKING_DIR/$base_script_name.$$.tmp") || logWrite2(E,"-- ERROR: Unable to open $WORKING_DIR/$base_script_name.$$.tmp for reading ($!)");
my $File = join("",<FH>);
close (FH);
eval $code;
open (FH, ">$WORKING_DIR/$base_script_name.$$.tmp") || logWrite2(E,"-- ERROR: Unable to open $WORKING_DIR/$base_script_name.$$.tmp for writing ($!)")
print FH $File;
close (FH);
我不知道问题是因为 -xism 修饰符还是因为 \b 修饰符,因为我看到脚本在版本 5.10 上进行了修改,并且显式添加了 \b 修饰符,可能真正的问题是这个修饰符。
参考下面的答案之一 ?^ 相当于 ?-xism ,我删除了代码
if ($] >=5.016)
{
$tempRegex=~ s!\^!-xism!;
}
从我的脚本中,所以 -xism 不再是我的正则表达式的一部分,并且我在我的正则表达式中添加了 \b ,就像 Perl 版本 5.10 所做的那样,下面的代码替换了我的正则表达式中的第二个插入符号,(?^:^FILE_DESC_LIMIT=\ d+(\s*)) 与 \b,使用生成的正则表达式 (?^:\bFILE_DESC_LIMIT=\d+(\s*)) ,匹配并替换字符串
if ($] =~ /5\.016/)
{
my $n=0;
$Source =~ s/\^/++$n==2?"\\b":"\^"/ge
}
正如我在正则表达式教程中看到的 \b 用于定义单词边界并执行整个单词匹配,我不清楚为什么它无法匹配
FILE_DESC_LIMIT=2048 文件中的字符串不带 \b。