Как печать Perl может добавить новую строку по умолчанию?


в Perl большинство моих print операторы принимают вид

print "hello." . "n";

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

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

8 77

8 ответов:

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

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

use feature qw(say);

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

посмотреть характеристика perldoc для более подробной информации.

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

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

выход:

hello
hello

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

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

say 'hello';

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

print "hello.\n";

эта реализация, вероятно, сделает ваше кодирование проще в целом.

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

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

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" в конце строк "надоедливой" рутиной, но если кто-то действительно хочет избежать их, это один из способов. Если бы мне пришлось поддерживать немного кода, который использует эту технику, я бы, вероятно, рефакторинг его Пронто.

в Perl 6 есть,say функции

если вы застряли с pre-5.10, то решения, приведенные выше, не полностью копируют это $LIST_SEPARATOR

он будет теперь действуйте больше как perl6, вот так

say @arr;
# OUTPUT
# alpha beta gamma
#

вы можете написать более читабельную форму использовать 5.010:

use v5.10;