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(<>ファイルハンドルなしのデフォルトは usingARGVです)。

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 に答える