Perl的打印怎么默认添加一个换行符?
在Perl中,我的大部分print
语句都采用这种forms
print "hello." . "\n";
有没有一种很好的方法来避免所有讨厌的“\ n”四处闲逛?
我知道我可以创build一个新的函数,例如myprint
自动附加\ n,但是如果我可以覆盖现有的print
,那将会很好。
Perl 6具有自动追加的say
function\n
。
如果添加,您也可以在Perl 5.10或5.12中使用say
use feature qw(say);
到你程序的开始。 或者你可以使用Modern :: Perl来获得这个和其他function。
有关更多详细信息,请参阅perldocfunction 。
如果Perl 5.10+不是一个选项,这里是一个快速和肮脏的近似。 这不完全相同,因为当它的第一个参数是句柄时,有一些魔法,但是对于打印到标准输出:
sub say {print @_, "\n"} say 'hello';
您可以在she-bang头中使用-l
选项:
#!/usr/bin/perl -l $text = "hello"; print $text; print $text;
输出:
hello hello
你写印刷说明的方式不必要的冗长。 没有必要将新行分隔成自己的string。 这已经足够了。
print "hello.\n";
这种实现可能会使您的编码更容易。
除了使用use feature "say"
或use 5.10.0
或use Modern::Perl
来获得内置的say
function,我要去pimp perl5i默认打开了很多合理的缺lessPerl 5function。
也许你想要改变你的输出logging分隔符换行:
local $\ = "\n";
$ perl -e 'print q{hello};print q{goodbye}' | od -c 0000000 hellogoodbye 0000014 $ perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c 0000000 hello \ngoodbye \n 0000016
更新:我的答案是能力而不是可取性。 我不认为在行尾加“\ n”是一件“讨厌的”杂事,但如果有人真的想要避开它,这是一种方法。 如果我必须维护一些使用这种技术的代码,我可能会重构它。
在Perl 6中,有say
function
如果你在5.10之前停滞不前,那么上面提供的解决scheme将不能完全复制say
function。 例如
sub say { print @_, "\n"; }
将不会与调用,如
say for @arr;
要么
for (@arr) { say; }
…因为上面的函数不作用于隐式的全局$_
类似print
和真正的say
函数。
要更密切地复制perl 5.10+ say
你想要这个function
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
内buildperformance有点不同。 用say @arr
或@arr.say
来调用它不会连接数组项,而是用列表分隔符来打印它们。 要在perl5中复制这个,你可以这样做
sub say { if (@_) { print join($", @_) . "\n"; } else { print $_ . "\n"; } }
$"
是全局列表分隔符variables,或者如果您使用的是英文$LIST_SEPARATOR
则是$LIST_SEPARATOR
现在它会像perl6一样行事
say @arr; # OUTPUT # alpha beta gamma #
你可以写更多可读的使用方式5.010 :
use v5.10;