W Perlu większość moich print
wypowiedzi ma formę
print "hello." . "\n";
Czy istnieje dobry sposób, aby uniknąć trzymania wszystkich nieznośnych "\ n" kłamstw?
Wiem, że mógłbym stworzyć nową funkcję, taką jak ta, myprint
która automatycznie dodaje \ n, ale byłoby miło, gdybym mógł zastąpić istniejącą print
.
perldoc perlvar
opisuje większość zastrzeżeń, po co je tutaj omawiać?Odpowiedzi:
Perl 6 ma
say
funkcję, która automatycznie dołącza\n
.Możesz również używać
say
w Perl 5.10 lub 5.12, jeśli dodaszuse feature qw(say);
na początek programu. Lub możesz użyć Modern :: Perl, aby uzyskać tę i inne funkcje.
Więcej szczegółów znajdziesz w opisie funkcji perldoc .
źródło
use 5.012;
albouse 5.010;
je zdobyć, jeśli używasz tych nowszychperl
s.Możesz użyć
-l
opcji w nagłówku she-bang:#!/usr/bin/perl -l $text = "hello"; print $text; print $text;
Wynik:
źródło
perl
opcjach, w tym o tym, co-l
robi, znajdziesz tutaj .Jeśli Perl 5.10+ nie wchodzi w grę, oto szybkie i brudne przybliżenie. To nie jest dokładnie to samo, ponieważ powiedz, że ma trochę magii, gdy jego pierwszy argument jest uchwytem, ale do drukowania na STDOUT:
sub say {print @_, "\n"} say 'hello';
źródło
Sposób, w jaki piszesz wyciąg do druku, jest niepotrzebnie rozwlekły. Nie ma potrzeby oddzielania nowej linii do własnego ciągu. To wystarczy.
print "hello.\n";
Ta świadomość prawdopodobnie ogólnie ułatwi ci kodowanie.
Oprócz używania
use feature "say"
lubuse 5.10.0
lub wuse Modern::Perl
celu uzyskania wbudowanejsay
funkcji, zamierzam pimp perl5i, który domyślnie włącza wiele rozsądnych brakujących funkcji Perl 5.źródło
Być może chcesz zmienić separator rekordów wyjściowych na nowy wiersz za pomocą:
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
Aktualizacja: moja odpowiedź mówi raczej o zdolności niż celowości. Nie uważam, aby dodawanie „\ n” na końcu linii było „brzydkim” obowiązkiem, ale jeśli ktoś naprawdę chce ich uniknąć, to jest jeden ze sposobów. Gdybym musiał utrzymywać fragment kodu wykorzystujący tę technikę, prawdopodobnie zrefaktorowałbym go natychmiast.
źródło
"helo\r\n"
którą teraz wysyła"helo\r\n\n"
.local $\ = "\n";
-l
jest świetne w przypadku jednowierszowych linii poleceń (patrz perldoc.perl.org/perlrun.html#Command-Switches ). Nie polecałbym tego w żadnym większym programie.Oto co znalazłem na https://perldoc.perl.org/perlvar.html :
przykład:
$\ = "\n"; print "a newline will be appended to the end of this line automatically";
źródło
W Perlu 6 jest
say
funkcjaźródło
Jeśli utkniesz w wersji wcześniejszej niż 5.10, powyższe rozwiązania nie będą w pełni replikować tej
say
funkcji. Na przykładsub say { print @_, "\n"; }
Nie będzie działać z wywołaniami, takimi jak
say for @arr;
lub
for (@arr) { say; }
... ponieważ powyższa funkcja nie działa na niejawne
$_
podobne globalneprint
i rzeczywistąsay
funkcję.Aby dokładniej powielić perl 5.10+
say
, potrzebujesz tej funkcjisub say { if (@_) { print @_, "\n"; } else { print $_, "\n"; } }
Który teraz działa w ten sposób
my @arr = qw( alpha beta gamma ); say @arr; # OUTPUT # alphabetagamma # say for @arr; # OUTPUT # alpha # beta # gamma #
say
Wbudowane w perl6 zachowuje się trochę inaczej. Wywołanie go za pomocąsay @arr
lub@arr.say
nie tylko połączy elementy tablicy, ale zamiast tego drukuje je oddzielone separatorem listy. Aby powielić to w perl5, zrobiłbyś tosub say { if (@_) { print join($", @_) . "\n"; } else { print $_ . "\n"; } }
$"
jest zmienną globalnego separatora listy lub, jeśli używasz,English.pm
to jest$LIST_SEPARATOR
Będzie teraz zachowywał się bardziej jak perl6
say @arr; # OUTPUT # alpha beta gamma #
źródło