3 Stimmen

chomp in perl funktioniert nicht wie erwartet

Ich habe ein merkwürdiges Verhalten von chomp in Perl gefunden und ich kann nicht verstehen, warum chomp so funktioniert.

Die folgende Zeile funktioniert nicht wie erwartet

if ( chomp($str1) eq chomp($str2) )

Das Folgende funktioniert jedoch problemlos

chomp $str1;
chomp $str2;
if ( $str1 eq $str2 )

Können Sie bitte einen Einblick in dieses Verhalten von chomp geben?

12voto

chomp ändert sein Argument. Es gibt kein verändertes Argument zurück. Das zweite Beispiel ist in der Tat, wie Sie es verwenden sollen.

editar : perldoc -f chomp sagt:

   chomp   This safer version of "chop" removes any trailing string that
           corresponds to the current value of $/ (also known as
           $INPUT_RECORD_SEPARATOR in the "English" module).  It returns
           the total number of characters removed from all its arguments.

2voto

evil otto Punkte 10038

chomp gibt die Anzahl der entfernten Zeichen zurück, nicht die Zeichenketten, die zerhackt wurden.

2voto

tangent Punkte 551

Ich mag den Namen chomp(), denn sein Klang verrät, was er tut. Wie @ruakh erwähnt, nimmt es ein oder mehrere Argumente, so dass Sie sagen können:

chomp($str1,$str2);
if ( $str1 eq $str2 ) ...

Sie können ihm auch ein Array von Zeichenketten übergeben, wie Sie es erhalten würden, wenn Sie eine ganze Datei auf einmal lesen würden, z.B.:

chomp(@lines);

0voto

mik Punkte 3076

Im Allgemeinen können Sie Folgendes verwenden s,$/$,,r regex als nicht-destruktives chomp. Sie entfernt das Satztrennzeichen $/ vom Ende des $_ oder die Zeichenkette, die mit =~ und gibt das Ergebnis zurück, ohne etwas zu ändern. Ihr Beispiel würde wie folgt aussehen:

if ( $str1 =~ s,$/$,,r eq $str2 =~ s,$/$,,r )

Formal sollte die Regex lauten s,\Q$/\E$,,r also $/ wird nicht als Regex behandelt. Im Absatzmodus müsste die Regex lauten s,\n*$,,r . Im Slurp- oder Fixed-Record-Modus wird der Regex überhaupt nicht benötigt (chomp bewirkt nichts).

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