195

Perl で、正規表現を使用して文字列の置換を実行し、元の変数を変更せずに値を別の変数に格納する良い方法は何ですか?

私は通常、文字列を新しい変数にコピーしてから、s///新しい文字列を置換する正規表現にバインドしますが、これを行うためのより良い方法があるかどうか疑問に思っていましたか?

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

8 に答える 8

276

これは、元の文字列を変更せずに文字列の変更されたコピーを取得するために常に使用してきたイディオムです。

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

perl 5.14.0 以降では、新しい/r 非破壊置換修飾子を使用できます:

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

注:
上記の解決策は、なくても機能しgます。また、他のモディファイアでも機能します。

関連項目:
perldoc perlrequick: Perl 正規表現のクイック スタート

于 2008-08-22T17:08:29.197 に答える
45

ステートメント:

(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;
于 2008-08-23T08:53:44.620 に答える
26

の下use strictで、次のように言います。

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

代わりは。

于 2008-09-15T12:49:15.390 に答える
13

ワンライナー ソリューションは、優れたコードよりもシボレスとして役立ちます。優れた Perl コーダーはそれを知っており、理解しているでしょうが、あなたが始めようとしている 2 行のコピーと変更の連句よりもはるかに透過性と読みやすさが劣ります。

言い換えれば、これを行うための良い方法は、あなたがすでに行っている方法です。読みやすさを犠牲にして不必要に簡潔にすることは得策ではありません。

于 2008-09-18T17:13:55.963 に答える
0

私は 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
于 2016-03-06T16:07:54.023 に答える
0

を使用して 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";
于 2008-09-11T03:51:28.667 に答える