【问题标题】:Perl - reading a filePerl - 读取文件
【发布时间】:2017-08-05 13:00:02
【问题描述】:

我想将一个文件读入一个数组。我知道一种方法,但即使没有这样的文件,我也不想停止我的程序。如果没有文件,我只想制作一个内部标志 1 并继续我的脚本。但是,我收到了一个错误,因为我没有正确关闭文件。请让我知道如何解决此问题。任何建议表示赞赏。

我的代码(ttt.pl):

#!/usr/bin/perl 

use strict;
use warnings;


my $flag=1;
my $filename="test.txt";

open ( my $fh, '<', $filename ) or $flag=0;
chomp ( my @input = <$fh> );
close ( $fh );

print $flag;

错误消息是:readline() on closed filehandle $fh at ./ttt.pl line 11.

【问题讨论】:

    标签: arrays perl file


    【解决方案1】:

    你必须检查你的标志仍然是 1

    #!/usr/bin/perl 
    
    use strict;
    use warnings;
    
    
    my $flag=1;
    my $filename="test.txt";
    
    open ( my $fh, '<', $filename ) or $flag=0;
    if ($flag == 1){
        chomp ( my @input = <$fh> );
        close ( $fh );
    }
    print $flag;
    

    【讨论】:

    • ++ 因为这确实有效,但如果您明确知道该文件可能不存在,最好在尝试open() 之前检查文件是否存在。
    • @stevieb 不,检查文件是否存在更糟糕,因为它会产生竞争条件。最好放弃$flag,使用if ( open my $fh, '&lt;', $filename ) { ...; close $fh or die "..." }
    • @cur4so - 感谢您的帮助。你的代码就是我想要找到的。
    【解决方案2】:

    您通常会使用file test operator(一般称为-X)来查看文件是否存在,然后再尝试打开它:

    if (-e $filename) {
        open(my $fh, '<', $filename) or die $!;
        # ...
    }
    

    -e 可能对您的需求过于宽泛;对于纯文件、目录、符号链接等,它将返回 true。如果您想将测试限制为仅纯文件,请改用 -f

    【讨论】:

      【解决方案3】:

      尝试打开文件并在失败时跳过它是最简单和最安全的方法。

      无论如何,我们总是检查失败(对吗?),在这里你想继续。 照常做吧

      foreach my $file (@filelist)
      {
          open my $fh, '<', $file or do {
              warn "Can't open $file: $!";
              next;
          };
      
          # process the file
      
          close $fh or warn "Can't close filehandle: $!";
      }
      

      这也有助于(如果罕见的话)竞态条件。

      【讨论】:

        猜你喜欢
        • 2013-11-14
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 2019-11-19
        相关资源
        最近更新 更多