Funktion chomp() in Perl

In der Programmiersprache Perl gibt es die eingebaute Funktion chomp(). Diese Funktion wird bei der Arbeit mit Zeichenketten. Im einfachsten Fall wird die Funktion chomp() entfernt das Letzte Symbol \n in variabler das übergeben argument in diese Funktion.

Hier ist ein Beispiel:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Dieses Programm zeigt den Text 'ASDF'.

  • In diesem Fall, wenn der Wert der Variablen endet nicht auf \n, wird der Wert nicht ändert
  • Falls eine Variable enthält mehr als ein Symbol \n am Ende, dann wird nur ein Zeichen gelöscht \n

Argumente

In diesem Fall, wenn Funktionen chomp nicht übertragen werden keine Argumente, wird die Funktion arbeitet mit дефолтной Variable $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

In diesem Fall, wenn in der Variablen $_ befindet sich undef verwendet und use warnings;, dann wird die Warnung:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

chomp;
Use of uninitialized value $_ in scalar chomp at script.pl line 6.

Funktion chomp() übertragen werden können Skalare, Arrays, Hashes. Im Falle der Hash die Funktion arbeitet nur mit den Werten der Schlüssel, der Schlüssel selbst nicht ändern.

Ein argument einer Funktion chomp() immer muss eine Variable sein. In diesem Fall, wenn versuchen Sie übergeben dieser Funktion die Zeile, dann wird der Fehler und die Ausführung des Programms wird gestoppt:

▶ Run
#!/usr/bin/perl

chomp("ASDF\n"); # Error!
Can't modify constant item in chomp at script.pl line 3, near ""ASDF\n")"
Execution of script.pl aborted due to compilation errors.

Der Rückgabewert

Funktion chomp() gibt immer eine ganze Zahl größer oder gleich 0. Wenn die Funktion zurückgibt 0, dies bedeutet, dass der Ersatz nicht war. Die Zahl der mehr 0 bedeutet, wie viel verändert wurde.

Hier ist ein Beispiel einer Situation, wenn die Funktion chomp() gibt die Anzahl der 2:

▶ Run
#!/usr/bin/perl

my @arr = ("ASDF\n", "QWERTY\n");
print chomp(@arr);

Hier ist ein Beispiel für die Verwendung des Rückgabewerts, um unterschiedliche der Code in diesem Fall war wenn ein Austausch oder Ersatz nicht war:

▶ Run
#!/usr/bin/perl

use feature qw(say);

my $string = "ASDF\n";

if (chomp($string)) {
    say 'Removed \n';
} else {
    say 'String is unchanged';
}

print "'$string'";

Variable $/

Funktion chomp() zerstört mit dem Ende der Zeile das Symbol enthält in der globalen Variable $/. Standardmäßig hat diese Variable enthält die Zeichen \n. Aber in diesem platziert werden können Variable irgendein anderes Symbol und dann die Funktion chomp() wird löschen. Hier ist ein Beispiel:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

Das Programm zeigt den Text 'ASD'.

In diesem Fall, wenn in der Variable befindet sich eine leere Zeichenfolge ($/ = '';), das chomp() löscht nicht ein Endezeichen \nund alle Zeichen \n am Ende der Zeile.

Standard-Verwendung

Sehr oft ist die Funktion chomp() verwendet, um zeilenweise zu Lesen aus der Datei. Für die Bearbeitung von Zeilen aus einer Datei ist oft sinnvoll, um nicht in diesen Zeilen es war ein Zeichen \n am Ende der Zeile:

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.csv';

open FILE, '<', $file_name or die $!;

while my $line (<FILE>) {
    chomp($line);
    print "Parsing line $line";
}

Entfernen Sie alle Symbole \n am Ende der Zeile

In der Regel Funktion chomp() entfernt nur ein Zeichen \n am Ende der Zeile:

▶ Run
#!/usr/bin/perl

my $string = "Line1\nLine2\n\n\n";

chomp($string);

print "'$string'";

Ergebnis:

'Line1
Line2

'

Es gibt mehrere Möglichkeiten, wie Sie können auch alle Symbole löschen \n am Ende der Zeile.

Hier ist ein Beispiel für die Verwendung eines regulären Ausdrucks:

▶ Run
#!/usr/bin/perl

my $string = "Line1\nLine2\n\n\n";

$string =~ s/\n*$//;

print "'$string'";

Ein anderes Verfahren zum entfernen alle Leerstellen ist einzustellen Variable $/ in die leere Zeile:

▶ Run
#!/usr/bin/perl

$/ = '';

my $string = "Line1\nLine2\n\n\n";

chomp($string);

print "'$string'";

Verwenden eines regulären Ausdrucks ist oft besser: es ist übersichtlicher und wird nicht geändert Globale Variable mit möglichen Auswirkungen auf den Code in anderen Teile des Programms.

Die offizielle Dokumentation

Hier ist die Ausgabe des Befehls perldoc -f chomp:

       chomp VARIABLE
       chomp( LIST )
       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.
               It's often used to remove the newline from the end of an input
               record when you're worried that the final record may be missing
               its newline.  When in paragraph mode ("$/ = """), it removes
               all trailing newlines from the string.  When in slurp mode ("$/
               = undef") or fixed-length record mode ($/ is a reference to an
               integer or the like; see perlvar) chomp() won't remove
               anything.  If VARIABLE is omitted, it chomps $_.  Example:

                   while (<>) {
                       chomp;  # avoid \n on last field
                       @array = split(/:/);
                       # ...
                   }

               If VARIABLE is a hash, it chomps the hash's values, but not its
               keys.

               You can actually chomp anything that's an lvalue, including an
               assignment:

                   chomp($cwd = `pwd`);
                   chomp($answer = );

               If you chomp a list, each element is chomped, and the total
               number of characters removed is returned.

               Note that parentheses are necessary when you're chomping
               anything that is not a simple variable.  This is because "chomp
               $cwd = `pwd`;" is interpreted as "(chomp $cwd) = `pwd`;",
               rather than as "chomp( $cwd = `pwd` )" which you might expect.
               Similarly, "chomp $a, $b" is interpreted as "chomp($a), $b"
               rather than as "chomp($a, $b)".

Andere Artikel