Perl的正则表达式警告:\ 1更好地写成$ 1日(EVAL 1)1号线
问题描述:
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',
答
假设你的模式匹配的地图格局保持不变,为什么不能摆脱它,简单地说:
$line =~ s/\s*=.*/=$newPassword/
+0
看起来他正试图保留空白。你可能需要'\ K'在'\ s *'之后 - 或者你打算在'=' – Axeman 2011-04-21 20:37:24
答
我看到你的代码有很多重复的。
假设您使用的是Perl 5.10或更高版本,这就是我将如何编写代码。
use strict;
use warnings;
use 5.010;
my $new_pass = 'abc123';
my @lines = ("pwd = abc", "pwd=abc", "password=def", "name= Mike");
my @match = qw'pwd password';
my $match = '(?:'.join('|', @match).')';
say for @lines;
say '';
s/$match \s* = \K .* /$new_pass/x for @lines;
# which is essentially the same as:
# s/($match \s* =) .* /$1$new_pass/x for @lines;
say for @lines;
+0
Brad开始比赛,你的代码很干净漂亮!谢谢! – John 2013-10-18 16:04:35
我没有时间现在尝试它,但尝试使用正则表达式引用而不是未插入的字符串。 ''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