在Perl中,我的大多数print
语句采用
print "hello." . "\n";
有没有一种很好的方法可以避免让所有讨厌的人停下来?
我知道我可以创建一个新的函数,例如myprint
自动附加\ n,但如果我可以覆盖现有的print
,那就太好了。
答案 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.0
或use 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";