Chomp в Perl не работает, как ожидалось - PullRequest
3 голосов
/ 14 февраля 2012

Я обнаружил странное поведение chomp в Perl, и я не могу понять, почему chomp работает так.

Следующая строка не работает должным образом

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

Но, следующее работает отлично

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

Не могли бы вы дать некоторое представление об этом поведении chomp?

Ответы [ 4 ]

12 голосов
/ 14 февраля 2012

chomp изменяет свой аргумент.Он не возвращает измененный аргумент.Второй пример, на самом деле, как вы должны его использовать.

edit : perldoc -f chomp говорит:

   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.
2 голосов
/ 14 февраля 2012

Мне нравится название chomp (), его звук говорит вам, что он делает. Как упоминает @ruakh, требуется один или несколько аргументов, поэтому вы можете сказать:

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

Вы также можете передать ему массив строк, например, что вы получите, прочитав целый файл сразу, например ::1004

chomp(@lines);
2 голосов
/ 14 февраля 2012

chomp возвращает количество удаленных символов, а не строки, которые были разбиты.

0 голосов
/ 27 февраля 2019

Как правило, вы можете использовать s,$/$,,r регулярное выражение в качестве неразрушающего chomp. Он удаляет разделитель записей $/ с конца $_ или строку, предоставленную с использованием =~, и возвращает результат без каких-либо изменений. Ваш пример будет выглядеть так:

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

Более формально регулярное выражение должно быть s,\Q$/\E$,,r, поэтому $/ не рассматривается как регулярное выражение. В режиме абзаца регулярное выражение должно быть s,\n*$,,r. В режиме slurp или фиксированной записи регулярное выражение вообще не нужно (chomp ничего не делает).

...