Perl的打印怎么默认添加一个换行符?

在Perl中,我的大部分print语句都采用这种forms

 print "hello." . "\n"; 

有没有一种很好的方法来避免所有讨厌的“\ n”四处闲逛?

我知道我可以创build一个新的函数,例如myprint自动附加\ n,但是如果我可以覆盖现有的print ,那将会很好。

Perl 6具有自动追加的sayfunction\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.0use Modern::Perl来获得内置的sayfunction,我要去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中,有sayfunction

如果你在5.10之前停滞不前,那么上面提供的解决scheme将不能完全复制sayfunction。 例如

 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;