1

我有一个 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() 调用确保脚本会被卡住!不知何故只在第一次发生。我不知道为什么

4

1 回答 1

2

eof()电话是问题。见perldoc -f eof

eof带空括号的指的是通过 访问的伪文件while (<>),它包含所有在 中命名的文件@ARGVSTDIN如果没有,则为。

特别是:

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

但是您的循环从另一个句柄读取,一个名为INPUT_FILE.

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

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

添加

use strict;
use warnings;

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

于 2012-08-01T00:50:01.820 回答