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

r1zhe5dt  于 2022-11-15  发布在  Perl
关注(0)|答案(8)|浏览(345)

在Perl中,我的大多数print语句采用以下形式

print "hello." . "\n";

有没有一个好的方法来避免所有讨厌的“\n“的躺在周围?
我知道我可以创建一个新函数,如自动追加的myprint,\n但如果我能覆盖现有的print,那就更好了。

o2rvlv0m

o2rvlv0m1#

Raku(Perl 6)有一个say函数,可以自动追加\n
如果您在Perl 5.10或5.12中添加了say,也可以在Perl 5.10或5.12中使用say

use feature qw(say);

或者您可以使用Modern::Perl来取得这项功能和其他功能。
有关详细信息,请参阅perldoc功能。

bf1o4zei

bf1o4zei2#

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

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

输出:

hello
hello
qvtsj1bj

qvtsj1bj3#

如果Perl 5.10+不是一个选项,这里有一个快速而粗略的近似值。它并不完全相同,因为当say的第一个参数是一个句柄时,它有一些魔力,但对于打印到STDOUT:

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

say 'hello';
cgh8pdjw

cgh8pdjw4#

你写print语句的方式不必要地冗长。没有必要把换行符分隔成它自己的字符串。这就足够了。

print "hello.\n";

一般来说,这种实现可能会使您的编码更容易。
除了使用use feature "say"use 5.10.0use Modern::Perl来获得内置的say特性之外,我还将使用perl5i,它将默认打开许多明智的Perl 5特性。

ar5n3qh5

ar5n3qh55#

也许您希望将输出记录分隔符更改为换行符:
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”是一件“讨厌的”苦差事,但如果有人真的想避免它们,这是一种方法。如果我必须维护一段使用这种技术的代码,我可能会立即重构它。

gcxthw6b

gcxthw6b6#

以下是我在https://perldoc.perl.org/perlvar.html上的发现:
$\打印操作符的输出记录分隔符。如果定义了,这个值将在打印操作符的最后一个参数之后打印。默认值为undef。
不能在句柄上调用output_record_separator(),只能作为静态方法调用。请参阅IO::Handle。
助记符:您设置$\而不是在print末尾添加“\n”。而且,它就像$/,但它是您从Perl“返回”的内容。
例如:

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

xsuvu9jc7#

在Raku(Perl 6)中有say函数。

myzjeezk

myzjeezk8#

如果您坚持使用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调用它将不仅仅是连接数组项,而是用列表分隔符将它们分开打印。

sub say {
    if (@_) { print join($", @_) . "\n"; }
    else { print $_ . "\n"; }
}

$"是全局列表分隔符变量,如果使用English.pm,则为$LIST_SEPARATOR
它现在的行为更像perl6,如下所示

say @arr;
# OUTPUT
# alpha beta gamma
#

相关问题