在perl 5.16中进行操作

时间:2017-07-31 13:46:43

标签: perl perl5.16

我正在尝试修复一个非常旧的脚本,它试图在文本文件中找到一个字符串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*))

我看到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修饰符被明确添加,可能真正的问题在于此修饰符。< / p>

参考下面的答案之一?^相当于?-xism,我删除了代码

if ($] >=5.016)
{
    $tempRegex=~ s!\^!-xism!;
}

从我的脚本,所以-xism不再是我的正则表达式的一部分了,我在我的正则表达式中添加了\ b为perl版本5.10完成,下面的代码替换了我的正则表达式中的第二个插入符号,(?^:^带有\ b的FILE_DESC_LIMIT = \ d +(\ s *)),带有正则表达式(?^:\ bFILE_DESC_LIMIT = \ d +(\ s *)),匹配并替换字符串

if ($] =~ /5\.016/)
{
    my $n=0;
    $Source =~ s/\^/++$n==2?"\\b":"\^"/ge
}

正如我在正则表达式教程中看到的\ b用于定义单词边界并执行整个单词匹配,我不清楚为什么它无法匹配 文件中的FILE_DESC_LIMIT = 2048字符串,没有\ b。

2 个答案:

答案 0 :(得分:2)

documentation on Extended Patterns in perlre有此

  

从Perl 5.14开始,"^"之后的"?"(插入符号或韵律重音符号)是等同于d-imnsx的简写。标志("d"除外)可以在插入符号后面覆盖它。但减号不合法。

在这些修饰符中,-imsx与您在v5.10中看到的匹配,而-n启用括号的捕获行为,d启用&#34;默认&#34;字符集行为。最后两个是新的修饰符

这些与v5.10中显示的值没有任何不同,因此您必须显示您的数据以及您为了改变行为而编写的内容

答案 1 :(得分:1)

请参阅Regular Expressions in Perl 5.14 Delta(?^现在表示默认修饰符。这只是编译的正则表达式如何序列化的问题,正则表达式中\b^之间的区别越重要。