perl 正则表达式警告 :\1 better written as $1 at (eval 1) line 1

标签 perl syntax warnings

use strict;
use warnings;

my $newPasswd = 'abc123';
my @lines = ( "pwd = abc", "pwd=abc", "password=def", "name= Mike" );

my %passwordMap = (
    'pwd(\\s*)=.*'      => 'pwd\\1= $newPasswd',
    'password(\\s*)=.*' => 'password\\1= $newPasswd',
);

print "@lines\n";

foreach my $line (@lines) {
    while ( my ( $key, $value ) = each(%passwordMap) ) {
        if ( $line =~ /$key/ ) {
            my $cmdStr = "\$line =~ s/$key/$value/";
            print "$cmdStr\n";
            eval($cmdStr);
            last;
        }
    }
}

print "@lines";

运行它会给我正确的结果:
pwd = abc pwd=abc password=def name= Mike
$line =~ s/pwd(\s*)=.*/pwd\1= $newPasswd/
\1 better written as $1 at (eval 2) line 1 (#1)
$line =~ s/password(\s*)=.*/password\1= $newPasswd/
\1 better written as $1 at (eval 3) line 1 (#1)
pwd = abc123 pwd=abc password= abc123 name= Mike

我不想看到警告,试图使用 $1 而不是\1,但它不起作用。我该怎么办?非常感谢。

最佳答案

\1是一个正则表达式模式,意思是“匹配第一组捕获括号捕获的内容”。在替换表达式中使用它绝对没有意义。要获取第一组捕获括号捕获的字符串,请使用 $1 .

$line =~ s/pwd(\s*)=.*/pwd\1= $newPasswd/

应该
$line =~ s/pwd(\s*)=.*/pwd$1= $newPasswd/

所以
'pwd(\\s*)=.*'      => 'pwd\\1= $newPasswd',
'password(\\s*)=.*' => 'password\\1= $newPasswd',

应该
'pwd(\\s*)=.*'      => 'pwd$1= $newPasswd',
'password(\\s*)=.*' => 'password$1= $newPasswd',

或者更好
qr/((?:pwd|password)\s*=).*/ => '$1= $newPasswd',

关于perl 正则表达式警告 :\1 better written as $1 at (eval 1) line 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5747427/

相关文章:

jquery - 为什么要将 $ 与 $self 和 $body 放在一起?并且 self 与 $self 相同

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

reactjs - 运行 npm install 时有关对等依赖项的警告

linux - 带有重定向输出的 Perl 颜色说明符

perl - BaseX : how to set up 中的基准测试

linux - 将与模式匹配的行从一个文件移动到另一个文件

perl - 这不是数组引用吗?为什么它不是数组引用?

javascript - 带有附加 || 的多个 var 和函数?

c++数组赋值多个值

r - R 中的警告 - 做笔记