Неправильно ли печатать $/вместо\n?
Документация Perl гласит, что $/
:
По умолчанию разделитель входных данных, новая строка. Это влияет на Perl's идея того, что такое "линия".
Итак, это в основном неправильно:
print STDERR $var, $/;
вместо:
print STDERR "$var\n";
?
Что может пойти не так, если я сделаю первый?
Ответы
Ответ 1
Возможно, вместо этого вы ищете разделитель выходной записи?
perldoc perlvar:
IO::Handle->output_record_separator( EXPR )
$OUTPUT_RECORD_SEPARATOR
$ORS
$\
Разделитель выходной записи для оператора печати. Если определено, это значение печатается после последнего из аргументов печати. По умолчанию используется "undef".
Вы не можете вызывать "output_record_separator()" на дескрипторе только как статический метод. См. IO::Handle.
Мнемоника: вы устанавливаете "$\
" вместо добавления "\n
" в конце печати. Кроме того, это просто как $/
, но это то, что вы получаете "назад" от Perl.
Например,
$\ = $/;
print STDERR $var;
Ответ 2
$/
по умолчанию является LF (U + 000A). Это тот же самый символ, созданный "\n"
[1]. Поэтому, если вы не изменили $/
, $/
и "\n"
эквивалентны. Если вы изменили $/
, тогда только вы знаете, почему, и поэтому только вы знаете, подходит ли $/
или "\n"
.
- В древних блоках MacOS
$/
default был CR (U + 000D), но также и то, что "\n"
было создано там.
Ответ 3
Вам нужен разделитель выходной записи $\ as xxfelixxx.
$/
по мере чтения input record separator
. Манипуляция может повлиять на то, как Perl считывает данные файла, которые вы предоставили. Например:
open my $fh, "<", $filename or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;
Приведенное выше приводит к тому, что весь контент файла обрабатывается скалярным $content, потому что у нас есть reset $/
.
Рассмотрим приведенный ниже код:
#!/usr/bin/perl
use strict;
use warnings;
my $content;
{local $/; $content = <DATA>}
print "Content is $content";
__DATA__
line 1
line 2
line 3
Выход:
Content is line 1
line 2
line 3
Но если вы не reset $/, как в нижнем коде:
#!/usr/bin/perl
use strict;
use warnings;
my $content = <DATA>;
print "Content is $content";
__DATA__
line 1
line 2
line 3
Выход будет Content is line 1
.
Это связано с тем, что разделитель входных записей был установлен в новую строку, и он возвращался после первой строки.