Perl脚本无缘无故卡在终端中

Perl脚本无缘无故卡在终端中,perl,cygwin,freeze,blocked,Perl,Cygwin,Freeze,Blocked,我有一个Perl脚本,它读取三个文件,并在读取每个文件后编写新文件。一切都是一根线 在这个脚本中,我打开并使用三个文本文件,并将内容存储在散列中。这些文件很大(接近3MB) 我使用循环遍历每个文件(打开->读取->执行一些操作(哈希表)->关闭) 我注意到,每当我扫描第一个文件时,Cygwin shell中的Perl终端窗口就会被卡住。当我按下enter键时,我可以看到脚本处理其余文件时没有任何问题 这很奇怪,因为我的脚本中没有从STDIN读取。此外,同样的逻辑适用于所有三个文件,因为所有文件都

我有一个Perl脚本,它读取三个文件,并在读取每个文件后编写新文件。一切都是一根线

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

我使用循环遍历每个文件(打开->读取->执行一些操作(哈希表)->关闭)

我注意到,每当我扫描第一个文件时,Cygwin shell中的Perl终端窗口就会被卡住。当我按下enter键时,我可以看到脚本处理其余文件时没有任何问题

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

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

我不能在这里发布脚本,但是里面没有多少东西可以发布。 这可能是我的Cygwin外壳的问题吗

如果这个问题不解决,我怎么能绕过它呢?比如在脚本进行时提供enter输入?更重要的是,如何调试这样的问题?

子读取集
{
@线在集合中=();
将@lines_按入_集合,$u[0];
而()
{$行=$\;
chomp($line);
如果($line=~/ENDNEWTYPE/i或$line=~/ENDSYNTYPE/或eof())
{
将@lines\u推入\u集合,$line;
最后;
}
其他的
{
将@lines\u推入\u集合,$line;
}
}
返回集合中的@lines\u;
}

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

调用
eof()
是个问题。看

带有空括号的
eof
指通过
while()
访问的伪文件,该伪文件由
@ARGV
中命名的所有文件组成,如果没有,则指向
STDIN

特别是:

请注意,此函数实际上读取一个字符,然后“ungetc”将其删除,因此在交互式上下文中没有用处

但是您的循环从另一个句柄读取,一个叫做
INPUT\u FILE

调用
eof(输入文件)
更有意义。但即使这样也可能没有必要;当外部循环到达
输入文件
的末尾时,它将终止

还有一些与您看到的症状无关的建议:


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

3MB不是一个大文件。我建议你发布一些代码,这样我们可以帮助你。以您现有的代码为例,将其归结为最短的代码段,该代码段仍将显示该行为,然后在此处编辑您的问题以包含该代码。3MB不是一个大文件。我们不能在没有看到代码的情况下进行调试;投票结束。@Wooble:给他一分钟时间更新。只需要更多信息的结束问题只会提示用户在几分钟后以更多信息重复发布问题。不幸的是,我无法共享代码。我很抱歉不方便。。。如有必要,请关闭此问题。非常感谢您的帮助,并对给您带来的不便表示歉意。@user1566968:不要共享代码。共享显示完全相同行为的代码片段。而且,简单地把它浓缩成一个小的测试片段,往往会发现你做错了什么;你很可能会自己发现的。请放心,有一个解决办法。在执行简单文件读取时,您遇到的不是预期的行为。
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;
}
use strict;
use warnings;