Функция chomp() в Perl

В языке программирования Perl есть встроенная функция chomp(). Эта функция используется при работе со строками. В самом простом случае функция chomp() удаляет последний символ \n в переменный которая передана аргументом в эту функцию.

Вот пример:

▶ Run
#!/usr/bin/perl

my $string = "ASDF\n";

chomp($string);

print "'$string'";

Эта программа выведет на экран текст 'ASDF'.

  • В том случае если значение переменной не заканчивается на \n, то значение не поменяется
  • В том случае если в переменной содержится более чем один символ \n в конце, то будет удален только один символ \n

Аргументы

В том случае если функции chomp не переданы никакие аргументы, то функция работает с дефолтной переменной $_:

▶ Run
#!/usr/bin/perl

$_ = "123\n";

chomp;

print "'$_'";

В том случае если в переменной $_ находится undef и используется use warnings;, то будет предупреждение:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

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

В функцию chomp() можно передавать скаляры, массивы, хеши. В случае хеша функция будет работать только со значениями ключей, сами ключи не изменятся.

Аргументом функции chomp() всегда должна быть переменная. В том случае если попробовать передать этой функции строку, то будет ошибка и выполнение программы будет остановлено:

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

Возвращаемое значение

Функция chomp() всегда возвращает целое число больше или равное 0. Если функция возвращает 0, это означает что замены не было. Число больше 0 означает сколько было изменений.

Вот пример ситуации когда функцию chomp() возвращает число 2:

▶ Run
#!/usr/bin/perl

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

Вот пример использования возвращаемого значения для того чтобы выполнить разный код в том случае если была замена или замены не было:

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

Переменная $/

Функция chomp() удаляет с конца строки символ который содержится в глобальной переменной $/. По умолчанию в этой переменной содержится символ \n. Но можно разместить в этой переменной какой-то другой символ и тогда функция chomp() будет удалять его. Вот пример:

▶ Run
#!/usr/bin/perl

$/ = "F";

my $string = "ASDF";

chomp($string);

print "'$string'";

Программа выведет на экран текст 'ASD'.

В том случае если в переменной находится пустая строка ($/ = '';), то chomp() удалит не один конечный символ \n, а все символы \n в конце строки.

Стандартное использование

Очень часто функция chomp() используется для того чтобы построчно читать из файла. Для обработки строк из файла часто удобно чтобы в этих строках не было символа \n в конце строки:

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

Убрать все символы \n в конце строки

Обычно функция chomp() удаляет только один символ \n в конце строки:

▶ Run
#!/usr/bin/perl

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

chomp($string);

print "'$string'";

Результат:

'Line1
Line2

'

Есть несколько способов как можно удалить все символы \n в конце строке.

Вот пример использования регулярного выражения:

▶ Run
#!/usr/bin/perl

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

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

print "'$string'";

Другой способ для удаления все конечных пробелов — это установить значение переменной $/ в пустую строку:

▶ Run
#!/usr/bin/perl

$/ = '';

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

chomp($string);

print "'$string'";

Использование регулярного выражения часто лучше: это нагляднее и не меняется глобальная переменная которая может повлиять на работу кода в других частях программы.

Официальная документация

Вот вывод команды 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)".

Другие статьи

Комментарии