2009-04-28 3 views
2

Ich schreibe ein Skript auf meinem persönlichen Computer, der mit dem Remote-Server verbunden ist. Ich denke, der Remote-Server hat Perl 4.0 oder eine niedrigere Version installiert und deshalb kann es das gleiche nicht erkennen. Gibt es eine Alternative zum Befehl chomp?Wie chomp eine Zeichenfolge, wenn ich Perl 4 habe?

+4

Perl 4? Ernst? Perl 5 ist seit fast 15 Jahren - seit dem 17. Oktober 1994, um genau zu sein. Sie sind mit einem Computer verbunden, der nicht schon so lange aktualisiert wurde? Ich schlage vor, noch einmal nachzusehen. – Tanktalus

+0

Es gibt Maschinen, die nur mit Perl 4 kommen. Sie müssen es nicht mögen, aber es ist wahr. –

Antwort

5

Es ist keine exakte Ersatz, aber man könnte versuchen:

$var =~ s/\r?\n?$// 

die Streifen entweder CRLF (DOS), LF (Unix), CR (Mac?).

Der normale Chomp-Operator löscht immer die aktuell definierte $INPUT_RECORD_SEPARATOR für das aktuelle O/S.

+0

Gute Idee, aber wenn $ var mehrere \ n-getrennte Zeilen enthält, passen Sie auf - je nachdem, wie Perl 4 "$" in einer Regex interpretiert, kann das obige das erste \ n statt das letzte entfernen. –

+0

Statt Chomping \ r \ n, wird der Wert von $/wie bereits erwähnt einfach gelöscht. –

+0

Ich dachte darüber nach, hatte aber keine Perl-4-Manpages zur Hand, um zu überprüfen, ob es funktionierte. Jedenfalls bevorzuge ich es, dass meine Eingabeparser dem Postelschen Gesetz folgen ("sei streng in dem, was du produzierst, und liberal in dem, was du akzeptierst"), so dass meine Version unabhängig davon funktioniert, ob die Eingabetextdatei im DOS- oder Unix-Format ist. – Alnitak

0

Ich glaube, chop() wurde in Pre-5 Perl verwendet. Nicht so nützlich wie chomp() natürlich. Wenn Sie zufällig Eingang sind Handhabung würden Sie wahrscheinlich besser dran, einen regulären Ausdruck verwenden, aber wenn Sie immer ein Unix-Format-Datei-Analyse:

while (<F>) { 
    chop(); 
    do_stuff(); 
} 

Als Kommentar unten Zustände, hacken() entfernt immer das letzte Zeichen des Lvalue, nicht nur, wenn es ein Newline-Zeichen ist (oder was in der Zeile endet var). Ich wusste das (daher der Kommentar "nicht so nützlich wie chomp()"), aber irgendwie vergaß ich, es tatsächlich einzugeben.

+1

Zur Verdeutlichung: der Unterschied zwischen chop und chomp ist, dass chop * immer * das letzte Zeichen löscht, egal ob es der aktuelle $ INPUT_RECORD_SEPARATOR ist oder nicht. – user55400

+0

Und das Eingabefeld Trennzeichen könnte mehr als ein Zeichen sein :) –

+0

Brian, was war dann Konvention in Perl4? Ich "spreche" nur wirklich perl5, aber der perl4-Code, den ich überprüfen musste, benutzte "chop()", wie Leute "chomp()" jetzt benutzen, weil sie das Format der Datei verstanden haben, die sie analysieren würden. Wenn es idiomatisch wäre, chop() nicht zu verwenden oder eine Menge davon in schützende Logik zu verpacken, könnten Sie ein Beispiel geben? Ansonsten fühle ich trotz meiner Downvotes meine Antwort auf "chop() war die nicht-so-gute Alternative zu chomp() in Perl4" ist eine sehr gültige Antwort auf "Gibt es eine Alternative zu chomp() in Perl4?" – jj33

1

Die Chop-Route zu gehen ist schlecht beraten, ich würde die Regex verwenden, sie sind mehr für andere haltbar und transparent. Das regelmäßige Ändern der Rekordvariable wird möglicherweise irgendwann ein schlechtes Paket polieren und seltsame Dinge verursachen.