如何在保留原始string的情况下对string执行Perlreplace?

在Perl中,使用正则expression式对string执行replace并将值存储在其他variables中而不更改原始值的好方法是什么?

我通常只是将string复制到一个新的variables,然后绑定到s///正则expression式replace新的string,但我想知道是否有更好的方法来做到这一点?

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

这是我一直用来获得一个string的修改副本而不改变原来的习惯用法:

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

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

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

注意:以上解决scheme无需工作。 他们也与其他修饰符一起工作。

该声明:

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

相当于:

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

或者,从Perl 5.13.2开始,您可以使用/r进行非破坏性replace:

 use 5.013; #... my $newstring = $oldstring =~ s/foo/bar/gr; 

use strict下,说:

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

代替。

单线解决scheme比好的代码更适用于shibboleth; 好的Perl编码人员会知道它并理解它,但是它比起你开始的双线复制和修改联系要透明和可读得多。

换句话说,做这件事的一个好方法就是你已经做到了这一点。 以可读性为代价的不必要的简洁是不成功的。

我讨厌foo和bar ..谁在编程中梦想这些非描述性的术语呢?

 my $oldstring = "replace donotreplace replace donotreplace replace donotreplace"; my $newstring = $oldstring; $newstring = s/replace/newword/g; print $newstring; %: newword donotreplace newword donotreplace newword donotreplace 

另一个5.14之前的解决scheme: http ://www.perlmonks.org/?node_id=346719(见japhy的post)

由于他的方法使用map ,所以对于数组来说也是很好的,但是需要级联map来产生一个临时数组(否则原始的会被修改):

 my @orig = ('this', 'this sucks', 'what is this?'); my @list = map { s/this/that/; $_ } map { $_ } @orig; # @orig unmodified 

如果你use strict;编写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; 。 对我而言, 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";