Perl的打印如何在默认情况下添加换行符?

时间:2010-05-24 18:40:40

标签: perl printing newline

在Perl中,我的大多数print语句采用

形式
print "hello." . "\n";

有没有一种很好的方法可以避免让所有讨厌的人停下来?

我知道我可以创建一个新的函数,例如myprint自动附加\ n,但如果我可以覆盖现有的print,那就太好了。

8 个答案:

答案 0 :(得分:90)

Perl 6具有say功能,可自动附加\n

如果添加

,您还可以在Perl 5.10或5.12中使用say
use feature qw(say);

到程序的开头。或者您可以使用Modern::Perl来获取此功能和其他功能。

有关详细信息,请参阅perldoc feature

答案 1 :(得分:30)

您可以使用she-bang标题中的-l选项:

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

<强>输出:

hello
hello

答案 2 :(得分:24)

如果Perl 5.10+不是一个选项,这里是一个快速而肮脏的近似值。它并不完全相同,因为当它的第一个arg是一个句柄时,说有一些魔法,但是打印到STDOUT:

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

say 'hello';

答案 3 :(得分:19)

您编写print语句的方式不必要地冗长。没有必要将换行符分隔为自己的字符串。这就足够了。

print "hello.\n";

这种实现可能会使您的编码更容易。

除了使用use feature "say"use 5.10.0use Modern::Perl获取内置的say功能外,我还要打开pimp perl5i默认情况下,很多明智的缺少Perl 5功能。

答案 4 :(得分:9)

也许您想要将输出记录分隔符更改为换行符:

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”是一个“讨厌”的苦差事,但如果有人真的想要避免它们,这是一种方式。如果我不得不维护一些使用这种技术的代码,我可能会将其重构出来。

答案 5 :(得分:3)

在Perl 6中,有say函数

答案 6 :(得分:1)

如果您坚持使用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
#

perl6中的say内置行为略有不同。使用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
#

答案 7 :(得分:1)

这是我在https://perldoc.perl.org/perlvar.html上找到的内容:

  

$ \   打印操作员的输出记录分隔符。如果定义,则该值为   在print的最后一个参数之后打印。默认值为undef。

     

您不能仅通过静态方法在句柄上调用output_record_separator()。   参见IO :: Handle。

     

助记符:设置$ \而不是在打印末尾添加“ \ n”。还有   就像$ /一样,但这就是您从Perl那里得到的“回报”。

示例:

$\ = "\n";
print "a newline will be appended to the end of this line automatically";