代码之家  ›  专栏  ›  技术社区  ›  rlbond

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

  •  1
  • rlbond  · 技术社区  · 15 年前

    我有一些简单的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 回复  |  直到 15 年前
        1
  •  18
  •   Sinan Ünür    15 年前

    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.
    
        2
  •  3
  •   oylenshpeegul    15 年前

    这更多的是一个评论而不是一个答案,但我不知道怎么做,而且这个问题已经被回答了。

    请注意,使用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);
    }
    

    按预期工作,甚至不会出现问题。我仍然惊讶于“说”有多有用,因为它有这么小的差别。

        3
  •  0
  •   Sinan Ünür    15 年前

    行可能解释如下

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

    也就是说,括号用作函数参数列表的分隔符,而“.\n”则被静默丢弃。尝试:

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