2013-03-13 31 views
5

Ich habe irgendwo statt chomp in Perl zu sehen, können wir einige regulären Ausdruck verwenden, um die gleiche Aufgabe zu erreichen. Kann mir jemand sagen, was mit dem regulären Ausdruck chomp in PerlRegulärer Ausdruck entspricht chomp

treffen ist

Vielen Dank im Voraus

+0

Können Sie ein Beispiel für Ihren Fall geben? – Raptor

+1

Sie sollten wirklich keinen regulären Ausdruck verwenden, wenn es eine einfache Alternative gibt – Lorkenpeist

+0

@Lorkenpeist TIMTOWTDI, Wenn Sie sie suchen wollen :) – gaussblurinc

Antwort

10

Was chomp tut, ist der Wert von $/ vom Ende seines Arguments Zeichenfolge (oder $_ wenn kein Argument) entfernen. So entspricht regex wäre:

s#\Q$/\E\z##; 

Beachten Sie die Verwendung von anderen Trennzeichen für s/// zur Vermeidung von Problemen mit der $/ variabel.

Es ist jedoch kein Vorteil, eine solche Regex zu verwenden, eher das Gegenteil. Dies ist meiner Meinung nach eine rein akademische Frage.

+0

eine genauere Antwort! – Alec

+3

nein, 's # \ Q $/\ z ##' (pedantisch, mit 'definiert $/&&! Ref $ /', plus ein Sonderfall für '$/eq '') – ysth

+1

hi, Eigentlich chomp entfernt die \ n am Ende der Zeile .. es ist in Ordnung, wenn Sie eine Datei in Linux Umgebung erstellt haben. bedenke, dass du die Datei in der Windows-Umgebung erstellt hast, so dass das Ende der Zeile es \ r \ n für die neue Zeile haben wird. Wenn du chomp verwendest, wird nur \ n nicht \ r entfernt. so "= ~ s/\ n $//; " regulärer Ausdruck wird besser ich denke – user2163744

5

Mindestens 995 mal aus 1000 (mit der bemerkenswerten Ausnahme von Tab-getrennten Daten) Sie

s/\s+\z//; 

statt

chomp; 

wollen Sie verarbeitet nachfolgende Leerzeichen (welche jemals nicht sein signifikant), Windows-Zeilenenden und Unix-Zeilenendungen.

+2

Trailing Whitespace ist recht bedeutungsvoll, wenn, sagen wir, die Daten Tab-getrennt ist und abschließende leere Felder hat. Diese Methode entfernt diese Felder sowie alle Datensatztrennzeichen. Generell ist 's/[\ r \ n] + \ z //' sicherer. – Borodin

+0

@Borodin, das ist wie ein Vorschlag, die Räder aus einem Auto zu entfernen, um es sicherer zu machen. Es kann einige völlig akzeptable Anwendungen für Autos ohne Räder geben, aber den Rest der Zeit lassen Sie sie eingeschaltet. 's/[\ r \ n] + \ z //' ist dumm, nicht sicherer. Verwenden Sie es, wenn Sie mit TSV umgehen, aber nicht den Rest der Zeit. – ikegami

+0

@ SinanÜnür: Überhaupt nicht. Ein leeres Feld sollte als leere Zeichenfolge dargestellt werden. Ein nicht vorhandenes Feld sollte "undef" erzeugen. Was würden Sie von Daten wie '3 \ t \ t5' erwarten? Sollte es wirklich etwas Besonderes sein, leere Felder zu verfolgen? – Borodin