在Perl中,我的大多数print语句采用以下形式
print
print "hello." . "\n";
有没有一个好的方法来避免所有讨厌的“\n“的躺在周围?我知道我可以创建一个新函数,如自动追加的myprint,\n但如果我能覆盖现有的print,那就更好了。
myprint
o2rvlv0m1#
Raku(Perl 6)有一个say函数,可以自动追加\n。如果您在Perl 5.10或5.12中添加了say,也可以在Perl 5.10或5.12中使用say。
say
\n
use feature qw(say);
或者您可以使用Modern::Perl来取得这项功能和其他功能。有关详细信息,请参阅perldoc功能。
bf1o4zei2#
可以在she-bang标题中使用-l选项:
-l
#!/usr/bin/perl -l $text = "hello"; print $text; print $text;
输出:
hello hello
qvtsj1bj3#
如果Perl 5.10+不是一个选项,这里有一个快速而粗略的近似值。它并不完全相同,因为当say的第一个参数是一个句柄时,它有一些魔力,但对于打印到STDOUT:
sub say {print @_, "\n"} say 'hello';
cgh8pdjw4#
你写print语句的方式不必要地冗长。没有必要把换行符分隔成它自己的字符串。这就足够了。
print "hello.\n";
一般来说,这种实现可能会使您的编码更容易。除了使用use feature "say"或use 5.10.0或use Modern::Perl来获得内置的say特性之外,我还将使用perl5i,它将默认打开许多明智的Perl 5特性。
use feature "say"
use 5.10.0
use Modern::Perl
ar5n3qh55#
也许您希望将输出记录分隔符更改为换行符:local $\ = "\n";
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”是一件“讨厌的”苦差事,但如果有人真的想避免它们,这是一种方法。如果我必须维护一段使用这种技术的代码,我可能会立即重构它。
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";
xsuvu9jc7#
在Raku(Perl 6)中有say函数。
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调用它将不仅仅是连接数组项,而是用列表分隔符将它们分开打印。
say @arr
@arr.say
sub say { if (@_) { print join($", @_) . "\n"; } else { print $_ . "\n"; } }
$"是全局列表分隔符变量,如果使用English.pm,则为$LIST_SEPARATOR它现在的行为更像perl6,如下所示
$"
English.pm
$LIST_SEPARATOR
say @arr; # OUTPUT # alpha beta gamma #
8条答案
按热度按时间o2rvlv0m1#
Raku(Perl 6)有一个
say
函数,可以自动追加\n
。如果您在Perl 5.10或5.12中添加了
say
,也可以在Perl 5.10或5.12中使用say
。或者您可以使用Modern::Perl来取得这项功能和其他功能。
有关详细信息,请参阅perldoc功能。
bf1o4zei2#
可以在she-bang标题中使用
-l
选项:输出:
qvtsj1bj3#
如果Perl 5.10+不是一个选项,这里有一个快速而粗略的近似值。它并不完全相同,因为当say的第一个参数是一个句柄时,它有一些魔力,但对于打印到STDOUT:
cgh8pdjw4#
你写print语句的方式不必要地冗长。没有必要把换行符分隔成它自己的字符串。这就足够了。
一般来说,这种实现可能会使您的编码更容易。
除了使用
use feature "say"
或use 5.10.0
或use Modern::Perl
来获得内置的say
特性之外,我还将使用perl5i,它将默认打开许多明智的Perl 5特性。ar5n3qh55#
也许您希望将输出记录分隔符更改为换行符:
local $\ = "\n";
更新:我的答案是功能而不是明智。我不认为在行尾添加“\n”是一件“讨厌的”苦差事,但如果有人真的想避免它们,这是一种方法。如果我必须维护一段使用这种技术的代码,我可能会立即重构它。
gcxthw6b6#
以下是我在https://perldoc.perl.org/perlvar.html上的发现:
$\打印操作符的输出记录分隔符。如果定义了,这个值将在打印操作符的最后一个参数之后打印。默认值为undef。
不能在句柄上调用output_record_separator(),只能作为静态方法调用。请参阅IO::Handle。
助记符:您设置$\而不是在print末尾添加“\n”。而且,它就像$/,但它是您从Perl“返回”的内容。
例如:
xsuvu9jc7#
在Raku(Perl 6)中有
say
函数。myzjeezk8#
如果您坚持使用5.10之前的版本,那么上面提供的解决方案将无法完全复制
say
函数。将不适用于诸如
或
...因为上述函数不作用于隐式全局
$_
(如print
)和真实的函数say
。要更接近地复制perl 5.10+
say
,您需要此函数现在的行为是这样的
perl6中内置的
say
的行为稍有不同。用say @arr
或@arr.say
调用它将不仅仅是连接数组项,而是用列表分隔符将它们分开打印。$"
是全局列表分隔符变量,如果使用English.pm
,则为$LIST_SEPARATOR
它现在的行为更像perl6,如下所示