2015-08-28 86 views
2

这是我的代码摘录:打印功能:我的标量和文本不打印

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'a PAS ETEtrouvé

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

任何帮助,将不胜感激。

+0

只需检查 - 您如何知道$ code_found为0? –

+0

微妙的问题,我认为迪斯科有关键 – chicks

+0

在猜测,'$ nouveau_code'来自一个源于WIndows系统的文件,并且您正在Linux上处理它? – Borodin

回答

3

猜测,$nouveau_code来自一个源自Windows系统的文件,并且您正在Linux上处理它?

如果在这种情况下使用chomp然后它会删除结尾的换行,而不是回车,并打印值将重置屏幕光标移动到该行的开头打印别的

的前简单的修复方法是用s/\R//替换chomp,这将删除线路末端的CR以及LF

1

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

  1. 您的第一个项目运行和print s出的第一次,但由于code_found=1它不进入if
  2. 您的第二项目的运行和CR或BS在数据掩盖了HERE IS印刷的事实
  3. 您的第二项没有发现一个代码,以便所述第二print发生和它的第一部分是由覆盖在变量

最简单的方法相同或CR BS顺序,以确认这是重定向你的输出看它像这样:

script > check.log 
vim check.log 

,你应该看到在那里的额外数据。 less也可以很好地代替vim