如何在保留原始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";