Was ist in Perl eine gute Möglichkeit, eine Ersetzung für eine Zeichenfolge mithilfe eines regulären Ausdrucks durchzuführen und den Wert in einer anderen Variablen zu speichern, ohne das Original zu ändern?
Normalerweise kopiere ich die Zeichenfolge einfach in eine neue Variable und binde sie dann an den s///
regulären Ausdruck, der die neue Zeichenfolge ersetzt. Ich habe mich jedoch gefragt, ob es einen besseren Weg gibt, dies zu tun.
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
my $new = $_ for $old =~ s/foo/bar;
funktionieren würde.s/foo/bar/ for my $newstring = $oldstring;
es funktioniert, aber es ist viel seltsamer.Die Aussage:
Welches ist gleichbedeutend mit:
Alternativ können Sie ab Perl 5.13.2
/r
eine zerstörungsfreie Substitution durchführen:quelle
g
in deiner Top-Regex vergessen ?Unter
use strict
sagen wir:stattdessen.
quelle
Die Einzeilerlösung ist als Shibboleth nützlicher als guter Code. Gute Perl-Codierer werden es wissen und verstehen, aber es ist viel weniger transparent und lesbar als das zweizeilige Couplet zum Kopieren und Ändern, mit dem Sie beginnen.
Mit anderen Worten, ein guter Weg, dies zu tun, ist die Art und Weise, wie Sie es bereits tun. Unnötige Präzision auf Kosten der Lesbarkeit ist kein Gewinn.
quelle
Eine weitere Lösung vor 5.14 : http://www.perlmonks.org/?node_id=346719 (siehe Japhys Beitrag)
Wie sein Ansatz verwendet
map
, funktioniert es auch gut für Arrays, erfordert jedoch eine Kaskadierungmap
, um ein temporäres Array zu erzeugen (andernfalls würde das Original geändert):quelle
Ich hasse Foo und Bar. Wer hat sich diese unbeschreiblichen Begriffe in der Programmierung überhaupt ausgedacht?
quelle
=~ s
.)newword donotnewword newword donotnewword newword donotnewword
foo
undbar
, wäre seine Antwort richtig gewesen. Wieder einmal zu beweisen, dass Bräuche aus einem bestimmten Grund existieren und Lehren nur auf die harte Tour gezogen werden. ;)Wenn Sie Perl mit schreiben
use strict;
, werden Sie feststellen, dass die einzeilige Syntax auch dann nicht gültig ist, wenn sie deklariert ist.Mit:
Du erhältst:
Stattdessen ist die Syntax, die Sie verwendet haben, eine Zeile länger, aber die syntaktisch korrekte Methode, um dies zu tun
use strict;
. Für mich ist das Verwendenuse strict;
jetzt nur noch eine Gewohnheit. Ich mache es automatisch. Jeder sollte.quelle
use warnings;
stattdessen-w
, erhalten Sie eine bessere Kontrolle: Zum Beispiel, wenn Sie Warnungen in einem Codeblock vorübergehend deaktivieren möchten.