在Perl中,我大部分的print
陈述采用以下形式
print "hello." . "\n";
有什么好方法可以避免使所有讨厌的\ n散布?
我知道我可以创建一个新函数,例如myprint
自动追加\ n,但是如果我可以覆盖现有函数,那就太好了print
。
perldoc perlvar
描述了大多数警告,为什么要在这里加以说明?
在Perl中,我大部分的print
陈述采用以下形式
print "hello." . "\n";
有什么好方法可以避免使所有讨厌的\ n散布?
我知道我可以创建一个新函数,例如myprint
自动追加\ n,但是如果我可以覆盖现有函数,那就太好了print
。
perldoc perlvar
描述了大多数警告,为什么要在这里加以说明?
Answers:
Perl 6具有say
自动附加的功能\n
。
say
如果添加,也可以在Perl 5.10或5.12中使用
use feature qw(say);
到程序的开始。或者,您可以使用Modern :: Perl获得此功能和其他功能。
有关更多详细信息,请参见perldoc功能。
use 5.012;
或use 5.010;
,如果你正在运行的新让它perl
秒。
您可以使用-l
she-bang标头中的选项:
#!/usr/bin/perl -l
$text = "hello";
print $text;
print $text;
输出:
hello
hello
您编写打印语句的方式不必要地冗长。无需将换行符分隔为自己的字符串。这样就足够了。
print "hello.\n";
通常,这种实现可能会使您的编码更容易。
除了使用use feature "say"
or或use 5.10.0
or use Modern::Perl
获得内置say
功能之外,我还将使用perl5i皮条客功能,该功能默认情况下会启用许多明智的Perl 5缺失功能。
也许您想使用以下命令将输出记录分隔符更改为换行符:
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”是一件令人讨厌的事情,但是如果有人真的想避免使用它们,这是一种方法。如果我必须维护一些使用该技术的代码,那么我可能会立即将其重构。
"helo\r\n"
现在发送的消息的网络代码"helo\r\n\n"
。
local $\ = "\n";
这是我在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";
如果您坚持使用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
#
say
perl6中的内置行为有所不同。使用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
#