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

Print function in a foreach loop : my scalar and text does not print

这是我的代码的摘录:

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 的迭代结果是(代码隐藏在这里,但是是字母数字):

HERE IS PAR****

n'a pas été trouvé

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

如有任何帮助,我们将不胜感激。

我怀疑您的第二个数据项包含退格符 (BS) 或回车 return (CR)。所以

  1. 您的第一项运行并且 print 第一次出现,但由于 code_found=1 它没有进入 if
  2. 您的第二个项目运行,数据中的 CR 或 BS 掩盖了 HERE IS 已打印的事实
  3. 你的第二个项目没有找到代码,所以第二个 print 发生了,它的第一部分被你变量中相同的 CR 或 BS 序列覆盖

确认这一点的简单方法是重定向您的输出并像这样查看它:

script > check.log
vim check.log

您应该会在其中看到额外的数据。 less 也可以代替 vim

据推测,$nouveau_code 来自 Windows 系统上的文件,而您正在 Linux 上处理它?

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

简单的修复方法是将 chomp 替换为 s/\R//,这将删除行尾的 CR 和 LF