qr operation in perl 5.16

泄露秘密 提交于 2019-12-04 07:09:35

问题


I am trying to fix a very old script, which is trying to find a string FILE_DESC_LIMIT in a text file and change it to something else.

For this my current script which is working fine on Perl 5.10 I see it uses a regular expression

    qr!^FILE_DESC_LIMIT=\d+(\s*)!;

But this is not working in Perl 5.16 , so I tried to print this expression. In 5.10 I see

    (?-xism:\bFILE_DESC_LIMIT=\d+(\s*))

While in Perl 5.16 i see

    (?^:^FILE_DESC_LIMIT=\d+(\s*))

I see qr was adding -xism while it not adding it in 5.16, why there is a difference here?

If I add it explicitly in my regular expression, it works. But I doubt the solution as Perl doesn't add it explicitly there might be some problem here.

Is there some different way which I should use for Perl 5.16? Why has Perl changed this behavior?

my code looks like this , we are creating a regex and then using regex we are fomulating an expression which is then evaluated on an open file, then the evaluated output is written to the same file.

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);

change which i did to make it work in perl 5.16 is , i added the -xism modifiers explicitly into the regex and also modified the \b modifier condition

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);

i dont know if the problem is because of -xism modifier or because of \b modifier, as i see the script was modified on version 5.10 and \b modifier was added explicitly, may the real problem is with this modifier.

referring to one of the answer below that ?^ is equivalent to ?-xism , i removed the code

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

from my script , so -xism is not part of my regex anymore , and i have added \b in my regex as done for perl version 5.10 , below code replaces the second caret sign in my regex , (?^:^FILE_DESC_LIMIT=\d+(\s*)) with \b, with the resultant regex (?^:\bFILE_DESC_LIMIT=\d+(\s*)) , the string is matched and replaced

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

as i see in regex tutorials \b is used to define word boundary and to perform a whole word match , i am not clear why it is not able to match FILE_DESC_LIMIT=2048 string in the file without \b.


回答1:


The documentation on Extended Patterns in perlre has this

Starting in Perl 5.14, a "^" (caret or circumflex accent) immediately after the "?" is a shorthand equivalent to d-imnsx . Flags (except "d" ) may follow the caret to override it. But a minus sign is not legal with it.

Of those modifiers, -imsx matches what you saw in v5.10, while -n enables the capturing behaviour of parentheses and d enables "default" character set behaviour. These last two are new modifiers

None of those are any different from the values you show in v5.10, so you will have to show your data and exactly what you wrote to get a change in behaviour




回答2:


See Regular Expressions in Perl 5.14 Delta: the (?^ now signifies default modifiers. It's just a matter of how the compiled regular expressions are serialized, the more important is the difference between \b and ^ in your regular expressions.



来源:https://stackoverflow.com/questions/45417696/qr-operation-in-perl-5-16

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!