Ich habe Kopfschmerzen auf der Suche nach diesem: Wie benutzt man s /// in einem Ausdruck im Gegensatz zu einer Zuweisung? Um zu verdeutlichen, was ich meine, suche ich nach einem Perl-Äquivalent von Pythons re (...) , wenn es im folgenden Kontext verwendet wird:
%Vor%Der einzige Weg, wie ich das in Perl machen kann, ist:
%Vor%Beachten Sie die zusätzliche Zuweisung.
Sie scheinen ein falsches Verständnis davon zu haben, wie =~
funktioniert. =~
ist ein Bindeoperator, der eine Variable einem Regexp-Operator zuordnet. Es macht keine Aufgabe.
Die Regexp-Operatoren arbeiten standardmäßig mit der Topic-Variable $_
, also ist s/foo/bar/;
identisch mit $_ =~ s/foo/bar/;
. Keine Zuweisung erfolgt. Die Themenvariable wird umgewandelt.
Der Fall ist analog, wenn Sie mit einer anderen Variablen arbeiten. $var =~ s/foo/bar/;
transformiert $var
, indem die erste Instanz von foo
durch bar
ersetzt wird. Keine Zuweisung erfolgt.
Der beste Rat, den ich Ihnen geben kann, ist Python in Python und Perl in Perl zu schreiben. Erwarten Sie nicht, dass die beiden Sprachen gleich sind.
Sie könnten tun wie DVK schlägt vor und schreiben Sie eine Subroutine, die das gewohnte Substitutionsverhalten reproduzieren wird.
Oder Sie könnten etwas Idiomatic Perl versuchen. Basierend auf Ihrem ausdrücklichen Wunsch, mehrere Transformationen in einer Zeile anzuwenden, habe ich einige Beispiele angeführt, die Sie vielleicht nützlich finden.
Hier verwende ich eine for
Schleife über ein Element, um $var
zu topicalisieren und viele hartcodierte Transformationen anzuwenden:
Oder vielleicht müssen Sie eine variable Gruppe von Transformationen anwenden. Ich definiere eine Subroutine, um eine Liste von Array-Referenzen zu durchlaufen, die alte / neue Transformationspaare definieren. Dieses Beispiel nutzt die listenorientierte Argumentverarbeitung von Perl, um eine beliebige Anzahl von Transformationen zu behandeln.
%Vor%Endlich ein bisschen Verwirrung über die Bereitstellung einer Version von transform, die das erste Argument ändert:
%Vor%Für mein eigenes Projekt würde ich wahrscheinlich eine der ersten beiden Optionen verwenden, je nach den Bedürfnissen des jeweiligen Problems.
Sie können ($new = $old) =~ s/whatever/whateverelse/;
für genau die gleiche Funktionalität verwenden, nach der Sie suchen:
Produziert:
%Vor%Genau das, was Sie wollen
Wenn Sie nach einer Funktion suchen, können Sie einfach Ihre eigene definieren, um eine Zuweisung zu vermeiden:
%Vor% Ergebnisse in new=cd
.
Die Substitution regulärer Ausdrücke von Perl findet immer "in-place" statt. Sie müssen also die Zeichenfolge in eine neue Variable kopieren und mit der neuen Variablen arbeiten:
%Vor%Darf ich davon ausgehen, dass Sie nicht zwei s /// in einer Zeile haben können, eine, die das Ergebnis der anderen verwendet, ohne Zwischenaufgaben? - mikeY
Ja, Sie haben Recht. Wenn Sie mehrere Ersetzungen auf die gleiche Zeichenfolge anwenden möchten, würde ich
tun %Vor% Das Folgende funktioniert nicht, da s//
die Anzahl der vorgenommenen Ersetzungen und nicht die geänderte Zeichenfolge zurückgibt.
Zusammenfassend unterscheiden sich die Regex-Operationen von Perl sehr stark von denen von Python. Sie sollten besser lernen, was Perl von Grund auf tut, anstatt zu versuchen, Python-Konzepte auf Perl
zu mappenTags und Links python regex perl substitution variable-assignment