0
sub open_file {
    my @files = @_;
    my @file_text = ();

    foreach my $file(@files){
        open(my $fh, '<', $file);
        @file_text = <$fh>;
        close($fh);
    }
    return @file_text;
}

你好呀。这种编码似乎有问题,尤其是foreach循环部分。 @files是一个数组,包含@files = (abc.html bcd.htm zxy.html);我想打开所有这些 html 文件并存储累积的 html 文本以@file_text供进一步使用。

但是我收到错误:

readline() on closed filehandle $fh at source-1-2.pl line 36
readline() on closed filehandle $fh at source-1-2.pl line 36
readline() on closed filehandle $fh at source-1-2.pl line 36

也许我得到了三行相同的错误,因为我在 3 个 html/htm 文件之间循环。

4

3 回答 3

4

也许检查是否open成功:

open(my $fh, '<', $file)
    or die "can't open $file: $!";
于 2013-05-03T09:33:11.793 回答
3

open如果不检查返回值,则不应使用:

open(my $fh, '<', $file) or die $!;
#                        ^^^^^^^^^ this part

可能发生的是打开失败,因此文件句柄从未打开。

于 2013-05-03T09:33:49.330 回答
1

除了其他答案中关于open的要点外,问题还询问“ ...打开所有这些 html 文件并将累积的 html 文本存储在 @file_text 中以供进一步使用。 ”。该代码有一行@file_text = <$fh>; ,这意味着@file_text只有最后一个文件的内容被读取。该行可能会替换为@new_text = <$fh>; push @file_text, @new_text;or @new_text = <$fh>; @file_text = (@file_text, @new_text);

于 2013-05-03T10:05:46.293 回答