2012-07-31 18 views
0

我有一个Perl脚本读取三个文件并在读取每个文件后写入新文件。一切都是一个线程。Perl脚本陷入终端没有明显的原因

在此脚本中,我打开并处理三个文本文件并将内容存储在散列中。这些文件很大(接近3 MB)。

我使用一个循环来遍历每个文件(打开 - >阅读 - >做一些动作(哈希表) - >关闭)

我注意到的是,每当我经过第一扫描文件,我的Cygwin shell中的Perl终端窗口卡住了。当我点击回车键时,我可以看到脚本没有任何问题地处理剩下的文件。

这很奇怪,因为在我的脚本中没有从STDIN读取。而且,同样的逻辑适用于所有三个文件,因为所有内容都在同一个循环中。

有没有人在这里遇到类似的问题?处理大文件或大哈希时通常会发生这种情况吗?

我不能在这里发布脚本,但是发表的内容并不多。 这可能是我的Cygwin shell中的问题吗?

如果这个问题没有消失,我该如何规避它?就像在脚本进行时提供输入输入一样?更重要的是,我该如何调试这样的问题?

sub read_set 
{ 
@lines_in_set =(); 
push @lines_in_set , $_[0]; 
while (<INPUT_FILE>) 
    { $line = $_; 
      chomp($line); 
      if ($line=~ /ENDNEWTYPE/i or $line =~ /ENDSYNTYPE/ or eof()) 
      { 
      push @lines_in_set , $line; 
      last; 
      } 
      else 
      { 
      push @lines_in_set , $line;  
      } 
    } 
    return @lines_in_set; 
} 

-------->我想我找到了问题: - 或eof()调用确保脚本将被卡住!不知何故只发生在第一次。我不知道为什么

+2

3MB并不是一个巨大的文件。我建议你发布一些代码,以便我们可以帮助你。把你现有的代码放到最短的代码片段中,然后编辑你的问题来包含代码。 – DavidO 2012-07-31 21:30:13

+0

3MB不是一个巨大的文件。我们无法查看代码就无法进行调试;投票结束。 – geoffspear 2012-07-31 21:30:15

+1

@Wooble:给他一分钟更新它。只有需要更多信息的关闭问题才会提示用户在几分钟后冗余地发布问题并提供更多信息。 – Wug 2012-07-31 21:34:05

回答

2

eof()呼叫是问题。见perldoc -f eof

eof与空括号是指通过while (<>)访问的伪文件,其中包括或者全部是@ARGV命名的文件,或者STDIN如果有没有。

,特别是:

请注意,该函数实际上读入一个字符,然后“ungetc函数” S,所以是不是在交互的环境中非常有用。

但是你的循环从另一个句柄中读取,其中一个名为INPUT_FILE

拨打eof(INPUT_FILE)会更有意义。但即使这可能没有必要;您的外部循环将在达到INPUT_FILE的末尾时终止。

一些更多的建议,没有涉及到你所看到的症状:

添加

use strict; 
use warnings; 

靠近你的脚本的顶部,并更正此产生的任何错误信息(perl -cw script-name做了编译期只检查)。您需要使用myperldoc -f my)声明变量。并使用一致的缩进;我建议您可以在大多数Perl文档中找到相同的样式。