0

バッチまたはコマンド プロンプトから入力 (テキスト ファイル) を提供する perl スクリプトがあります。バッチ ファイルから入力を提供すると、ファイルが存在しない場合があります。No such file exists エラーをキャッチし、このエラーがスローされたときに他のタスクを実行したいと考えています。以下のサンプルコードを見つけてください。

while(<>) //here it throws an error when file doesn't exists.
{
    #parse the file.
}
#if error is thrown i want to handle that error and do some other task.
4

2 に答える 2

3

@ARGV使用する前にフィルタリング<>

@ARGV = grep {-e $_} @ARGV;
if(scalar(@ARGV)==0) die('no files');
# now carry on, if we've got here there is something to do with files that exist
while(<>) {
  #...
}

<>@ARGVにリストされているファイルから読み取るため、そこに到達する前にフィルターをかけると、存在しないファイルを読み取ろうとしません。@ARGVのサイズのチェックを追加しました。これは、すべて存在しないリストファイルを指定すると、stdin(<>の使用の裏側)で待機するためです。これは、あなたがそれをしたくないことを前提としています。

ただし、stdinから読みたくない場合<>は、おそらく悪い選択です。内のファイルのリストをステップスルーすることもできます@ARGV。stdinから読み取るオプションが必要な場合は、現在のモードを知る必要があります。

$have_files = scalar(@ARGV);
@ARGV = grep {-e $_} @ARGV;
if($have_files && scalar(grep {defined $_} @ARGV)==0) die('no files');
# now carry on, if we've got here there is something to do;
#   have files that exist or expecting stdin
while(<>) {
  #...
}
于 2012-11-15T13:49:52.770 に答える
0

ひし形演算子 とは、次の<>ことを意味します。

の名前を見て、@ARGV開きたいファイルとして扱います。あたかも 1 つの大きなファイルであるかのように、それらすべてをループするだけです。実際、Perl はこの目的のために ARGV ファイルハンドルを使用します。

コマンド ライン引数が指定されていない場合は、STDIN代わりに使用します。

そのため、ファイルが存在しない場合、Perl はエラー メッセージ ( Can't open nonexistant_file: ...) を表示し、次のファイルに進みます。これは通常、あなたが望むものです。そうでない場合は、手動で行ってください。perlopページから盗んだ:

unshift(@ARGV, '-') unless @ARGV;
  FILE: while ($ARGV = shift) {
    open(ARGV, $ARGV);
    LINE: while (<ARGV>) {
      ...         # code for each line
    }
  }

問題が発生すると、このopen 関数は偽の値を返します。したがって、常にopen次のように呼び出します

open my $filehandle "<", $filename or die "Can't open $filename: $!";

には失敗の$!理由が含まれています。ingの代わりにdie、他のエラー回復を行うことができます。

use feature qw(say);
@ARGV or @ARGV = "-"; # the - symbolizes STDIN
FILE: while (my $filename = shift @ARGV) {
    my $filehandle;
    unless (open $filehandle, "<", $filename) {
       say qq(Oh dear, I can't open "$filename". What do you wan't me to do?);
       my $tries = 5;
       do {
         say qq(Type "q" to quit, or "n" for the next file);
         my $response = <STDIN>;
         exit      if $response =~ /^q/i;
         next FILE if $response =~ /^n/i;
         say "I have no idea what that meant.";
       } while --$tries;
       say "I give up" and exit!!1;
    }
    LINE: while (my $line = <$filehandle>) {
       # do something with $line
    }
}
于 2012-11-15T13:33:33.050 に答える