1

我正在编写一个 perl 脚本来打开一个文本文件并对其执行一些转换。每当文本文件不可用时,脚本都会引发错误,提示“不存在此类文件或目录”。

我想抓住那个错误然后创建文本文件。

while (<>) {       #i am passing filename from the batch file
    #some task
}
# if the above while loop fails it throws no such file or directory exists error. I want to  catch it and do some other task.
4

2 回答 2

1

这些特定的错误是由后面的“魔术”发送给 STDERR 的警告ARGV。为什么不直接重定向 STDERR?

perl script.pl foo bar 2>error.log

如果这还不够好,您将不得不开始使用$SIG{__WARN__}(yuck) 或停止使用ARGV(<>没有文件句柄默认为 using ARGV)。

for my $argv (@ARGV ? @ARGV : '-') {
    open(my $argv_fh, $argv)
       or do {
             ... print message to log file ...
             next;
          };

    while (<$argv_fh>) {
       ...
    }
}
于 2012-11-02T09:29:44.840 回答
1

与其尝试捕获文件不存在的警告,不如尝试通过getopt传递文件路径并在使用文件测试运算符打开之前测试文件的存在/可读性。

编辑:更新示例

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Std;

my %opts;
getopt('f', \%opts);

die "use -f to specify the file" unless defined $opts{f};

if(! -e $opts{f} ){
    print "file doesn't exist\n";
}
elsif(! -r $opts{f} ){
    print "file isn't readable\n";
}
elsif(! -f $opts{f} ){
    print "file is not a normal file\n";
}
else{
    open( my $fh, '<', $opts{f} ) or print "whatever error handling logic\n";
}
于 2012-11-02T09:56:59.653 回答