it-swarm.dev

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

在Perl中,我的大多数print语句都采用了这种形式

print "hello." . "\n";

是否有一种很好的方法可以避免让所有讨厌的人“躺着”?

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

85
Mike

Perl 6具有say函数,可自动附加\n

如果添加,您还可以在Perl 5.10或5.12中使用say

use feature qw(say);

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

有关详细信息,请参阅 perldoc功能

90
Josh Kelley

您可以在she-bang标头中使用-l选项:

#!/usr/bin/Perl -l

$text = "hello";

print $text;
print $text;

输出:

hello
hello
30
jaypal singh

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

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

say 'hello';
24
Eric Strom

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

print "hello.\n";

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

除了使用use feature "say"use 5.10.0use Modern::Perl来获取内置的say功能之外,我还要使用pimp Perl5i 默认情况下会打开许多​​明智缺失的Perl 5功能。

19
Schwern

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

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

9
David M

在Perl 6中,有 say function

3
Michael Mrozek

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

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

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

您不能在句柄上调用output_record_separator(),仅作为静态方法。请参阅IO :: Handle。

助记符:你设置$ \而不是在打印结束时添加“\ n”。而且,它就像$ /,但它是你从Perl“回来”的东西。

例:

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