0

grepコマンドへのパイプを開き、結果を 1 行ずつ読んでいます。完了したら、パイプを閉じます。grepが何かを見つけた場合、 close()は正常に完了します。grepで何も見つから ない場合、close()は機能しません。

問題をデモするためのfooは次のとおりです。

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my $search = shift // die "Usage: foo search_string";

open my $grep_h, "grep '$search' ./foo |"
  or die "open grep failed: $!";

while (defined (my $line = <$grep_h>)) {
    chomp $line;
    say "\t: $line";
}
close $grep_h or warn "Error closing grep pipe: $!";

ここで、 fooを呼び出して「warn」を検索します。

~/private/perl$ ./foo warn
    : use warnings;
    : close $grep_h or warn "Error closing grep pipe: $!";

ここで、 fooを呼び出して「blarg」を検索します。

~/private/perl$ ./foo blarg
Error closing grep pipe:  at ./foo line 16.

このエラーが発生するのはなぜですか?

4

1 に答える 1

6

close($child)を設定します$?$?がゼロでない場合は false を返します。

close($grep_h);
die "Can't close: $!\n" if $? == -1;
die "Child died from signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "Child exited from error ".($? >> 8)."\n" if $? >> 8;

grep一致するものが見つからない場合はエラーが返されるため、「Child exited from error 1」が表示されます。

$ echo foo | grep foo
foo

$ echo $?    # Equivalent to Perl's $? >> 8
0

$ echo foo | grep bar

$ echo $?
1
于 2013-04-27T01:57:35.713 に答える