Perl脚本没有明显原因卡在终端

时间:2012-07-31 21:27:57

标签: perl cygwin hang blocked

我有一个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;
}

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; }

--------&GT;我想我发现了问题: - 或者eof()调用确保脚本会卡住!!不知怎的,只在第一次发生。我不知道为什么,但

1 个答案:

答案 0 :(得分:2)

eof()来电是问题所在。请参阅perldoc -f eof

带有空括号的

eof引用通过while (<>)访问的伪文件,该文件由@ARGV中指定的所有文件组成,如果没有,则由STDIN组成

特别是:

  

请注意,此函数实际上会读取一个字符,然后“ungetc”它,因此在交互式上下文中没用。

但是你的循环从另一个句柄读取,一个叫INPUT_FILE

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

更多建议,与您所看到的症状无关:

添加

use strict;
use warnings;

在脚本顶部附近,并更正它产生的任何错误消息(perl -cw script-name执行仅编译检查)。您需要使用myperldoc -f my)声明变量。并使用一致的缩进;我建议您在大多数Perl文档中找到相同的样式。