Funktion chomp() i Perl

I programmeringssproget Perl har en indbygget funktion chomp(). Du kan bruge denne funktion, når man arbejder med strenge. I det enkleste tilfælde, funktion chomp() fjerner den sidste symbol \nAC der er en bestået argument i funktionen.

Her er et eksempel:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Dette program viser teksten 'ASDF'.

  • Hvis værdien af den variabel, der ikke ende med at \n, vil værdien ikke ændres
  • Hvis en variabel, der indeholder mere end ét tegn \n i den sidste ende, vil det blive slettet kun karakter \n

Argumenter

Hvis funktionen chomp er ikke vedtaget nogen argumenter, funktionen fungerer med standard variable $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

I dette tilfælde, hvis den variable $_ er undef og anvendes use warnings;, vil advarsel:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

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

I funktion chomp() , kan du gå skalarer, arrays, hashes. I tilfælde af hash funktionen vil kun arbejde med værdier af nøgler, nøgler, sig vil ikke ændre sig.

Argumentet for en funktion chomp() skal altid være variable. Hvis at forsøge at videregive denne funktion en snor, vil fejl og udførelsen af et program vil blive stoppet:

▶ 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.

Return værdi

Funktion chomp() altid returnerer et heltal, der er større end eller lig med 0. Hvis funktionen returnerer 0, betyder det, at der var ingen udskiftning. Antallet af mere 0 betyder, hvor meget det ændrer sig.

Her er et eksempel på en situation, hvor funktionen chomp() returnerer antallet 2:

▶ Run
#!/usr/bin/perl

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

Her er et eksempel på brug af retur-værdi til at opfylde forskellige - kode, hvis der ikke var en erstatning blev ikke:

▶ 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'";

Variabel $/

Funktion chomp() fjerner slutningen af en linje symboler, der er indeholdt i den globale variabel $/. Som standard er denne variabel indeholder symbolet \n. Men du kan skrive i dette en variabel af nogle andre symboler, og derefter den funktion, chomp() vil fjerne det. Her er et eksempel:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

Programmet vil vise teksten 'ASD'.

I dette tilfælde, hvis variablen er en tom streng ($/ = '';), så chomp() vil fjerne enkelt afsluttende \n, og alle tegn \n i slutningen af rækken.

Standard-brug

Meget ofte er en funktion af chomp() er vant til at læse linje for linje fra fil. Til behandling af strenge fra en fil, er det ofte praktisk at i disse linjer er ikke det var symbolet \n ved enden af linjen:

#!/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";
}

For at fjerne alle tegn \n i slutningen af linjen

Normalt en funktion af chomp() fjerner kun et tegn \n i slutningen af linjen:

▶ Run
#!/usr/bin/perl

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

chomp($string);

print "'$string'";

Resultatet:

'Line1
Line2

'

Der er flere måder, hvordan du kan fjerne alle symboler \n i slutningen af linjen.

Her er et eksempel på brug af regulære udtryk:

▶ Run
#!/usr/bin/perl

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

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

print "'$string'";

En anden måde at fjerne alle trailing spaces er at sætte værdi variabel $/ til en tom streng:

▶ Run
#!/usr/bin/perl

$/ = '';

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

chomp($string);

print "'$string'";

Brug af regulære udtryk er bedre: det er klarere, og det ændrer ikke globale variable som kan påvirke kode i andre dele af programmet.

Officiel dokumentation

Her er outputtet af kommandoen 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 = <STDIN>);

               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)".

Relaterede emner

Andre artikler