Perl で、正規表現を使用して文字列の置換を実行し、元の変数を変更せずに値を別の変数に格納する良い方法は何ですか?
私は通常、文字列を新しい変数にコピーしてから、s///
新しい文字列を置換する正規表現にバインドしますが、これを行うためのより良い方法があるかどうか疑問に思っていましたか?
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
これは、元の文字列を変更せずに文字列の変更されたコピーを取得するために常に使用してきたイディオムです。
(my $newstring = $oldstring) =~ s/foo/bar/g;
perl 5.14.0 以降では、新しい/r
非破壊置換修飾子を使用できます:
my $newstring = $oldstring =~ s/foo/bar/gr;
注:
上記の解決策は、なくても機能しg
ます。また、他のモディファイアでも機能します。
ステートメント:
(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;
の下use strict
で、次のように言います。
(my $new = $original) =~ s/foo/bar/;
代わりは。
ワンライナー ソリューションは、優れたコードよりもシボレスとして役立ちます。優れた Perl コーダーはそれを知っており、理解しているでしょうが、あなたが始めようとしている 2 行のコピーと変更の連句よりもはるかに透過性と読みやすさが劣ります。
言い換えれば、これを行うための良い方法は、あなたがすでに行っている方法です。読みやすさを犠牲にして不必要に簡潔にすることは得策ではありません。
私は 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
を使用して 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";