perl正则表达式警告:\1最好在(eval 1)第1行写为$1

perl正则表达式警告:\1最好在(eval 1)第1行写为$1,perl,syntax,warnings,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

运行它将为我提供正确的结果:

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";
我不想看到警告,尝试使用$1而不是\1,但无效。我该怎么办?非常感谢。

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

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
应该是

$line =~ s/pwd(\s*)=.*/pwd\1= $newPasswd/
'pwd(\\s*)=.*'      => 'pwd\\1= $newPasswd',
'password(\\s*)=.*' => 'password\\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',

我看到你的代码中有很多重复

$line =~ s/\s*=.*/=$newPassword/
假设您使用的是Perl5.10或更高版本,我会这样编写您的代码

$line =~ s/\s*=.*/=$newPassword/

我现在没有时间尝试,但是尝试使用正则表达式引用,而不是不相关的字符串<代码>'pwd(\\s*)=.'=>qr/pwd$1=$newPasswd/,。此外,如果您需要元组第一部分中的反向引用,请考虑只使用一个数组并立即删除两个项,或者如果这给了您威力,则使用一个数组引用的数组,例如:`My@ pWMAP =([’fo’,' Bar’],[’BAZ’,Buz’);这些方法比散列更好,因为任何标量值都可以存储在每个有序对的第一个元素中。的可能重复项看起来像是他试图保留空白。您可能需要在
\s*
后面加一个
\K
——或者您想在
=
开始匹配