我有一个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()调用确保脚本会卡住!!不知怎的,只在第一次发生。我不知道为什么,但
答案 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
执行仅编译检查)。您需要使用my
(perldoc -f my
)声明变量。并使用一致的缩进;我建议您在大多数Perl文档中找到相同的样式。