【发布时间】:2011-04-21 17:10:14
【问题描述】:
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,但它不起作用。我应该怎么办?非常感谢。
【问题讨论】:
-
我现在没有时间尝试,但尝试使用正则表达式引用而不是未插值的字符串。
'pwd(\\s*)=.*' => qr/pwd$1= $newPasswd/,。此外,如果您在元组的第一部分需要反向引用,请考虑只使用一个数组并一次剥离两个项目,或者如果这给了您威力,请使用数组引用数组,如下所示:`my @pwMap = ([ 'foo','bar'], ['baz', 'buz']);这些方法比散列更好,因为任何标量值都可以存储在每个有序对的第一个元素中。