Неправильно ли печатать $/вместо\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.

Это связано с тем, что разделитель входных записей был установлен в новую строку, и он возвращался после первой строки.