Как печать Perl может добавить новую строку по умолчанию? - PullRequest
86 голосов
/ 24 мая 2010

В Perl большинство моих print утверждений принимают форму

print "hello." . "\n";

Есть ли хороший способ избежать того, чтобы все надоедливые "\ n" валялись?

Iзнаю, что я мог бы создать новую функцию, такую ​​как myprint, которая автоматически добавляется \ n, но было бы неплохо, если бы я мог переопределить существующую print.

Ответы [ 8 ]

92 голосов
/ 24 мая 2010

Perl 6 имеет функцию say, которая автоматически добавляет \n.

Вы также можете использовать say в Perl 5.10 или 5.12, если вы добавите

use feature qw(say);

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

Подробнее см. perldoc .

30 голосов
/ 03 августа 2014

Вы можете использовать опцию -l в заголовке she-bang:

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

Выход:

hello
hello
24 голосов
/ 24 мая 2010

Если Perl 5.10+ не вариант, вот быстрое и грязное приближение.Это не совсем то же самое, поскольку у say есть немного магии, когда его первый аргумент - дескриптор, но для печати в STDOUT:

sub say {print @_, "\n"}

say 'hello';
19 голосов
/ 24 мая 2010

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

print "hello.\n";

Эта реализация, вероятно, облегчит ваше кодирование в целом.

В дополнение к использованию use feature "say" или use 5.10.0 или use Modern::Perl, чтобы получить встроенную функцию say, я собираюсь pimp perl5i , которая включает в себя множество разумных пропущенных Perl 5 функций по умолчанию.

9 голосов
/ 24 мая 2010

Возможно, вы хотите изменить разделитель выходных записей на перевод строки:

local $\ = "\n";

$ perl -e 'print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o   g   o   o   d   b   y   e                
0000014
$ perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o  \n   g   o   o   d   b   y   e  \n        
0000016

Обновление: мой ответ говорит скорее о возможностях, чем о целесообразности.Я не считаю, что добавление «\ n» в конце строк - это «надоедливая» рутина, но если кто-то действительно хочет их избежать, это один из способов.Если бы мне пришлось поддерживать немного кода, использующего эту технику, я бы, вероятно, быстро его реорганизовал.

3 голосов
/ 24 мая 2010

В Perl 6 есть функция say

1 голос
/ 15 января 2019

Вот что я нашел в https://perldoc.perl.org/perlvar.html:

$ \ Разделитель выходных записей для оператора печати.Если определено, это значение печатается после последнего аргумента печати.По умолчанию undef.

Вы не можете вызывать output_record_separator () для дескриптора, только как статический метод.См. IO :: Handle.

Мнемоника: вы устанавливаете $ \ вместо добавления "\ n" в конце печати.Кроме того, это похоже на $ /, но это то, что вы получаете «назад» из Perl.

пример:

$\ = "\n";
print "a newline will be appended to the end of this line automatically";
1 голос
/ 03 августа 2015

Если вы застряли с пре-5.10, то решения, представленные выше, не будут полностью повторять функцию say. Например

sub say { print @_, "\n"; }

Не будет работать с такими вызовами, как

say for @arr;

или

for (@arr) {
    say;
}

... потому что вышеуказанная функция не действует на неявную глобальную $_, такую ​​как print и действительную say функцию.

Чтобы более точно воспроизвести perl 5.10+ say, вам нужна эта функция

sub say {
    if (@_) { print @_, "\n"; }
    else { print $_, "\n"; }
}

Который сейчас действует так

my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#

Встроенный в perl6 say ведет себя немного по-другому. Вызов его с помощью say @arr или @arr.say не просто объединит элементы массива, но вместо этого напечатает их, разделенные разделителем списка. Чтобы повторить это в perl5, вы должны сделать это

sub say {
    if (@_) { print join($", @_) . "\n"; }
    else { print $_ . "\n"; }
}

$" - это переменная разделителя глобального списка, или, если вы используете English.pm, тогда это $LIST_SEPARATOR

Теперь он будет больше похож на perl6, вот так

say @arr;
# OUTPUT
# alpha beta gamma
#
...