回答:
これは、元の文字列を変更せずに文字列の変更されたコピーを取得するために常に使用してきたイディオムです。
(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;
それがうまくいくことを意味すると信じていますが、それははるかに奇妙です。
ステートメント:
(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;
g
はあなたのトップの正規表現を忘れましたか?
ワンライナーソリューションは、優れたコードよりもシボレスとして有用です。優れたPerlプログラマーはそれを知って理解しますが、最初の2行のコピーと変更のカプレットよりもはるかに透過的で読みにくいです。
言い換えれば、これを行うための良い方法は、すでにそれを行っている方法です。読みやすさを犠牲にして不必要に簡潔にすることは勝ちではありません。
5.14より前の別のソリューション:http : //www.perlmonks.org/? node_id=346719 node_id=346719(japhyの投稿を参照)
彼のアプローチはを使用map
しているため、配列に対してもうまく機能しますがmap
、一時配列を生成するためにカスケードする必要があります(そうしないと、元の配列が変更されます):
my @orig = ('this', 'this sucks', 'what is this?');
my @list = map { s/this/that/; $_ } map { $_ } @orig;
# @orig unmodified
私は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
andを使用していた場合bar
、彼の答えは正確だっただろう。もう一度、理由があって慣習が存在することを証明し、レッスンは難しい方法でのみ学習されます。;)
Perlをuse strict;
で記述した場合、宣言されていても、1行の構文が無効であることがわかります。
と:
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.
代わりに、これまで使用してきた構文は、1行長くなりますが、で構文的に正しい方法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
、より強力な制御が得られます。たとえば、コードのブロックで警告を一時的にオフにする場合などです。