如何在保留原始字符串的同时对字符串执行Perl替换?

regex perl replace

181857 观看

7回复

8053 作者的声誉

在Perl中,有什么好方法可以使用正则表达式对字符串进行替换并将值存储在其他变量中,而无需更改原始变量?

我通常只是将字符串复制到新变量,然后将其绑定到s///对新字符串进行替换的正则表达式,但是我想知道是否有更好的方法来做到这一点?

$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
作者: kaybenleroll 的来源 发布者: 2008 年 8 月 22 日

回应 7


239

13106 作者的声誉

决定

这是我惯常使用的成语,无需更改原始字符串即可获得字符串的修改后的副本:

(my $newstring = $oldstring) =~ s/foo/bar/g;

在perl 5.14.0或更高版本中,可以使用新的/r 非破坏性替换修饰符:

my $newstring = $oldstring =~ s/foo/bar/gr; 

注意:以上解决方案g也无法使用。它们还可以与任何其他修饰符一起使用。

作者: John Siracusa 发布者: 2008 年 8 月 22 日

42

29211 作者的声誉

该声明:

(my $newstring = $oldstring) =~ s/foo/bar/g;

等效于:

my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

另外,从Perl 5.13.2开始,您可以/r用来进行非破坏性替换:

use 5.013;
#...
my $newstring = $oldstring =~ s/foo/bar/gr;
作者: Pat 发布者: 2008 年 8 月 23 日

-1

4571 作者的声誉

如果使用编写Perl use strict;,那么即使声明了该语法,单行语法也是无效的。

带有:

my ($newstring = $oldstring) =~ s/foo/bar/;

你得到:

Can't declare scalar assignment in "my" at script.pl line 7, near ") =~"
Execution of script.pl aborted due to compilation errors.

取而代之的是,您一直在使用的语法(一行较长)是使用的正确语法use strict;。对我来说,使用use strict;现在只是一种习惯。我会自动执行。大家应该。

#!/usr/bin/env perl -wT

use strict;

my $oldstring = "foo one foo two foo three";
my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

print "$oldstring","\n";
print "$newstring","\n";
作者: Tim Kennedy 发布者: 2008 年 9 月 11 日

21

1071 作者的声誉

在下use strict,说:

(my $new = $original) =~ s/foo/bar/;

代替。

作者: Sam Kington 发布者: 2008 年 9 月 15 日

9

1035 作者的声誉

单行代码解决方案比起好的代码更有用。好的Perl编码人员会知道并理解它,但是它比您刚开始的两行复制和修改对联的透明度和可读性要差得多。

换句话说,执行此操作的一种好方法是您已经执行的操作。以可读性为代价的不必要的简洁并不是胜利。

作者: Josh Millard 发布者: 2008 年 9 月 18 日

1

157 作者的声誉

我讨厌foo和bar ..谁反正在编程中想到了这些非描述性术语?

my $oldstring = "replace donotreplace replace donotreplace replace donotreplace";

my $newstring = $oldstring;
$newstring =~ s/replace/newword/g; # inplace replacement

print $newstring;
%: newword donotreplace newword donotreplace newword donotreplace
作者: JoGotta 发布者: 2016 年 3 月 6 日

1

301 作者的声誉

另一个5.14之前的解决方案:http ://www.perlmonks.org/?node_id=346719(请参阅japhy的帖子)

正如他的方法所使用的map,它也适用于数组,但是需要级联map以生成一个临时数组(否则将修改原始数组):

my @orig = ('this', 'this sucks', 'what is this?');
my @list = map { s/this/that/; $_ } map { $_ } @orig;
# @orig unmodified
作者: textral 发布者: 2017 年 5 月 25 日
32x32