为什么不在此Perl代码中打印换行符?

时间:2009-07-21 21:07:15

标签: perl printing

我有一些简单的Perl代码:

#!/usr/bin/perl

use strict;   # not in the OP, recommended
use warnings; # not in the OP, recommended

my $val = 1;
for ( 1 .. 100 ) {
    $val = ($val * $val + 1) % 8051;
    print ($val / 8050) . " \n";
}

但是当我运行它时,输出是:

bash-3.2$ perl ./rand.pl
0.0002484472049689440.000621118012422360.003229813664596270.08409937888198760.92
... <snipped for brevity> ...
2919250.9284472049689440.3526708074534160.1081987577639750.2295652173913040.1839
751552795030.433540372670807bash-3.2$

我做错了吗?

3 个答案:

答案 0 :(得分:18)

C:\> perldoc -f print

  

另外要注意不要遵循   用左括号打印关键字   除非你想要相应的   右括号终止   打印的参数 - 插入一个+   或括号括起来   参数。

因此,您需要的是:

print( ($val / 8050) . "\n" );

print +($val / 8050) . "\n";

您的语句打印$val / 8050的结果,然后将"\n"连接到print的返回值,然后丢弃结果值。

顺便说一下,如果你:

use warnings;

然后perl会告诉你:

   print (...) interpreted as function at t.pl line 5.
   Useless use of concatenation (.) or string in void context at t.pl line 5.

答案 1 :(得分:3)

这更多的是评论而不是答案,但我不知道如何做到这一点,无论如何问题已经得到解答。

请注意,使用say而不是print来整齐地回避整个问题。也就是说,

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my $val = 1;
for ( 1 .. 100 ) {
    $val = ($val * $val + 1) % 8051;
    say ($val / 8050);
}

按预期工作,即使没有出现问题。鉴于它有如此微小的差异,我仍然对这说有多有用感到惊讶。

答案 2 :(得分:0)

该行可能解释如下

(print($val / 8050)) . " \n";

即。括号用作函数参数列表的分隔符,静默丢弃。“\ n”。尝试:

 print( ($val/8050) . "\n" );