212 Stimmen

Wie führe ich eine Perl-Substitution an einer Zeichenkette durch und behalte dabei das Original bei?

Wie kann man in Perl eine Zeichenkette mit einem regulären Ausdruck ersetzen und den Wert in einer anderen Variablen speichern, ohne das Original zu verändern?

Normalerweise kopiere ich die Zeichenkette einfach in eine neue Variable und binde sie dann an die s/// regex, die die Ersetzung auf die neue Zeichenfolge, aber ich frage mich, ob es einen besseren Weg, um dies zu tun?

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

1voto

Tim Kennedy Punkte 5612

Wenn Sie Perl mit use strict; dann werden Sie feststellen, dass die einzeilige Syntax nicht gültig ist, selbst wenn sie deklariert wird.

Mit:

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

Sie erhalten:

Can't declare scalar assignment in "my" at script.pl line 7, near ") =~"
Execution of script.pl aborted due to compilation errors.

Stattdessen ist die von Ihnen verwendete Syntax, die zwar eine Zeile länger ist, die syntaktisch korrekte Art, dies zu tun mit use strict; . Für mich ist die Verwendung von use strict; ist nur noch eine Gewohnheit. Ich tue es automatisch. Das sollte jeder tun.

#!/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";

3 Stimmen

もし、あなたが use warnings; anstelle von -w erhalten Sie eine bessere Kontrolle: zum Beispiel, wenn Sie Warnungen in einem Codeblock vorübergehend ausschalten wollen.

1voto

JoGotta Punkte 215

Ich hasse foo und bar wer hat sich diese nicht beschreibenden Begriffe in der Programmierung überhaupt ausgedacht?

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

2 Stimmen

Was ist der Unterschied zum Original? (Und ich glaube, Sie wollen =~ s .)

2 Stimmen

Clbuttic Fehler. Die tatsächliche Ausgabe dieses Codes ist newword donotnewword newword donotnewword newword donotnewword

3 Stimmen

Sehen Sie, wenn JoGotta die traditionelle und vertraute Methode verwendet hätte foo y bar wäre seine Antwort richtig gewesen. Das beweist einmal mehr, dass es Bräuche aus einem bestimmten Grund gibt und man nur auf die harte Tour lernt ;)

1voto

ngn999 Punkte 610

Wie wäre es, wenn ich das nur in Oneliner verwende? sprintf("%s", $oldstring)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X