foreach循环中的打印功能:我的标量和文本无法打印

时间:2015-08-28 13:01:24

标签: perl output

这是我的代码摘录:

foreach my $nouveau_code (@tableau_codes_utilises) {
        my $code_found = 0;
        foreach my $ligne_code_prospect (@tableau_liste_codes_prospects) {
                //SOME CODE
        }
        print "HERE IS $nouveau_code\n";
        if ( $code_found == 0 ) {
                print "le code $nouveau_code n'a pas été trouvé\n";
                STDOUT->autoflush;
        }
}

$code_found等于0的迭代结果是(代码隐藏在这里,但是是字母数字):

  

这是PAR ****

     

n'apasététrouvé

我不明白为什么第二次打印(在if序列中)不打印整行。我想有一个缓冲问题,但我找不到发生了什么。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

猜测一下,$nouveau_code来自一个源自Windows系统的文件,你是在Linux上处理它吗?

如果你在这种情况下使用chomp那么它将删除尾随换行符,但不会删除回车符,并且打印该值会在打印任何其他内容之前将屏幕光标重置为行的开头

简单的解决方法是将chomp替换为s/\R//,这将删除CR以及行尾的LF

答案 1 :(得分:1)

我怀疑这里发生的事情是你的第二个数据项包含退格(BS)或回车(CR)。所以

  1. 您的第一个项目第一次运行,print第一次运行,但自code_found=1以来它没有进入if
  2. 你的第二个项目运行,数据中的CR或BS模糊了HERE IS被打印的事实
  3. 您的第二个项目没有找到代码,因此第二个print发生,并且其第一部分被变量中的相同CR或BS序列覆盖
  4. 确认这一点的简单方法是重定向输出并按如下方式查看:

    script > check.log
    vim check.log
    

    你应该看到那里的额外数据。 less代替vim也可以正常工作。