Answers:
这是我惯常使用的成语,无需更改原始字符串即可获得字符串的修改后的副本:
(my $newstring = $oldstring) =~ s/foo/bar/g;
在perl 5.14.0或更高版本中,可以使用新的/r
非破坏性替换修饰符:
my $newstring = $oldstring =~ s/foo/bar/gr;
注意:以上解决方案g
无法正常工作。它们还可以与任何其他修饰符一起使用。
my $new = $_ for $old =~ s/foo/bar;
会起作用?
s/foo/bar/ for my $newstring = $oldstring;
它有效,但是很奇怪。
单行代码解决方案比起好的代码更有用。好的Perl编码人员会知道并理解它,但是它比您刚开始的两行复制和修改对联的透明度和可读性要差得多。
换句话说,执行此操作的一种好方法是您已经执行的操作。以可读性为代价的不必要的简洁并不是胜利。
我讨厌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
=~ s
。)
newword donotnewword newword donotnewword newword donotnewword
foo
和bar
,他的答案将是准确的。再次证明习俗的存在是有原因的,只能以艰难的方式来吸取教训。;)
如果使用编写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";
use warnings;
而不是-w
,那么您将获得更大的控制权:例如,如果您要暂时关闭代码块中的警告。