В Perl большинство моих print
утверждений имеют форму
print "hello." . "\n";
Есть ли хороший способ избежать того, чтобы все надоедливые "\ n" валялись?
Я знаю, что могу создать новую функцию, например, myprint
которая автоматически добавляет \ n, но было бы неплохо, если бы я мог переопределить существующую print
.
perldoc perlvar
описывает большинство предостережений, зачем их здесь беспокоить?Ответы:
Perl 6 имеет
say
функцию, которая автоматически добавляет\n
.Вы также можете использовать
say
Perl 5.10 или 5.12, если добавитеuse feature qw(say);
в начало вашей программы. Или вы можете использовать Modern :: Perl, чтобы получить эту и другие возможности.
Подробнее см. Функцию perldoc .
источник
use 5.012;
илиuse 5.010;
получить его, если вы используете эти новые версииperl
.Вы можете использовать
-l
опцию в заголовке she-bang:#!/usr/bin/perl -l $text = "hello"; print $text; print $text;
Выход:
источник
perl
вариантах, в том числе о том, что-l
происходит, можно узнать здесь .Если Perl 5.10+ не подходит, вот быстрое и грязное приближение. Это не совсем то же самое, поскольку say имеет некоторую магию, когда его первый аргумент является дескриптором, но для печати в 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" в конце строк "досадной" рутиной, но если кто-то действительно хочет их избежать, это один из способов. Если бы мне пришлось поддерживать небольшой код, использующий эту технику, я бы, вероятно, быстро реорганизовал его.
источник
"helo\r\n"
которое сейчас отправляет"helo\r\n\n"
.local $\ = "\n";
-l
отлично подходит для однострочных команд командной строки (см. Perldoc.perl.org/perlrun.html#Command-Switches ). Я бы не рекомендовал его ни в одной более крупной программе.Вот что я нашел на https://perldoc.perl.org/perlvar.html :
пример:
$\ = "\n"; print "a newline will be appended to the end of this line automatically";
источник
В Perl 6 есть
say
функцияисточник
Если вы застряли с версией до 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 #
say
Встроенный в Perl6 ведет себя немного по- другому. Вызов его с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 #
источник