Funkcja chomp() w Perl

W języku programowania Perl jest wbudowana funkcja chomp(). Funkcja ta jest używana podczas pracy z wierszami. W najprostszym przypadku funkcja chomp() usuwa ostatni symbol \n w zmienny która przekazana argumentem w tej funkcji.

Oto przykład:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Ten program wyświetla na ekranie tekst 'ASDF'.

  • W przypadku, gdy wartość zmiennej nie kończy się na \n, to wartość się nie zmieni
  • W przypadku, gdy w zmiennej zawiera więcej niż jeden znak \n w końcu, to zostanie usunięty tylko jeden znak \n

Argumenty

W przypadku, gdy funkcje chomp nie zostaną przekazane żadne argumenty, to funkcja działa z дефолтной zmiennej $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

W przypadku, gdy w zmiennej $_ jest undef i jest używany use warnings;, to będzie ostrzeżenie:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

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

W funkcji chomp() można wysyłać скаляры, tablice, хеши. W przypadku mieszania funkcja będzie działać tylko z wartościami kluczy, same klucze nie zmienią.

Argumentem funkcji chomp() zawsze musi być zmienna. W przypadku, gdy spróbuj wysłać z tej funkcji, wiersz, to będzie błąd i wykonanie programu zostanie zatrzymane:

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

Wartość zwracana

Funkcja chomp() zawsze zwraca liczbę całkowitą większą lub równą 0. Jeśli funkcja zwraca 0, oznacza to, że wymiany nie było. Liczba jest większa 0 oznacza ile było zmian.

Oto przykład sytuacji, gdy funkcję chomp() zwraca liczbę 2:

▶ Run
#!/usr/bin/perl

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

Oto przykład wykorzystania wartości zwracanej, aby wykonać różne kod w tym przypadku jeżeli nie był wymieniany lub wymiany nie było:

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

Zmienna $/

Funkcja chomp() usuwa z końca wiersza symbol, który zawiera w globalnej zmiennej $/. Domyślnie zmienna zawiera symbol \n. Ale można umieścić w tej zmiennej jakiś inny symbol i wtedy funkcja chomp() usunie go. Oto przykład:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

Program wyświetla na ekranie tekst 'ASD'.

W tym przypadku, jeśli zmienna jest pusta linia ($/ = '';), to chomp() usunie nie jeden końcowy symbol \n, a wszystkie znaki \n na końcu wiersza.

Typowe zastosowanie

Bardzo często funkcja chomp() służy do tego aby przeczytać linijka po linijce z pliku. Do obsługi linii z pliku jest często wygodne, aby w tych wierszach nie było znaku \n na końcu wiersza:

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

Usunąć wszystkie znaki \n na końcu wiersza

Zwykle funkcja chomp() usuwa tylko jeden znak \n na końcu wiersza:

▶ Run
#!/usr/bin/perl

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

chomp($string);

print "'$string'";

Wynik:

'Line1
Line2

'

Istnieje kilka sposobów jak można usunąć wszystkie znaki \n na końcu linii.

Oto przykład użycia wyrażenia regularnego:

▶ Run
#!/usr/bin/perl

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

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

print "'$string'";

Innym sposobem, aby usunąć wszystkie końcowych spacji — to ustawić zmiennej $/ pusty wiersz:

▶ Run
#!/usr/bin/perl

$/ = '';

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

chomp($string);

print "'$string'";

Korzystanie z wyrażenia regularnego często lepiej: to bardziej przejrzyste i nie zmienia się zmienna globalna, która może wpłynąć na działanie kodu w innych częściach programu.

Oficjalna dokumentacja

Oto wynik polecenia 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)".

Tematy pokrewne

Inne artykuły