Wie kann ich Perls // in einem Ausdruck verwenden?

7

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.

    
Mansour 19.04.2010, 01:47
quelle

5 Antworten

7

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:

%Vor%

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.

    
daotoad 19.04.2010, 07:59
quelle
11

Sie können ($new = $old) =~ s/whatever/whateverelse/; für genau die gleiche Funktionalität verwenden, nach der Sie suchen:

%Vor%

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 .

    
DVK 19.04.2010 01:57
quelle
7

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%     
Grant McLean 19.04.2010 02:00
quelle
2

Sie möchten, dass $ newstring das Ergebnis der Substitution ist, richtig?

In etwa so:

%Vor%

Sollte funktionieren. Die Zuweisung setzt $newstring auf $oldstring und berechnet dann $newstring , was der Substitution entspricht.

    
jon 19.04.2010 02:02
quelle
1

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.

%Vor%

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 mappen     
justintime 19.04.2010 08:08
quelle