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 /,'。此外,如果你需要在元組的第一部分使用反向引用,可以考慮只使用一個數組並且一次剝離兩個元素,或者如果這給了willies,可以使用如下的數組引用:'my @pwMap =([ 'foo','bar'],['baz','buz']);這些方法比hash更好,因爲任何標量值都可以存儲在每個有序對的第一個元素中。 – daotoad 2011-04-21 17:13:46
[在Perl正則表達式替換中使用$ 1與\ 1有什麼區別?](http://stackoverflow.com/questions/3068236/what-is-the-difference-between-using-1-vs- 1-per-per-regex-substitutions) – 2017-02-03 09:04:46