0

例えば:

open (PS , " tail -n 1 $file | grep win " );

ファイルハンドルが空かどうかを調べたい。

4

4 に答える 4

5

eofファイルハンドルが使い果たされているかどうかを確認するために使用することもできます。これは、コードに大まかに基づいた図です。また、3引数形式の。で字句ファイルハンドルを使用していることに注意してくださいopen

use strict;
use warnings;

my ($file_name, $find, $n) = @ARGV;

open my $fh, '-|', "tail -n $n $file_name | grep $find" or die $!;

if (eof $fh){
    print "No lines\n";
}
else {
    print <$fh>;
}
于 2010-05-10T12:10:21.937 に答える
3

eof読み込もうとする前に呼び出すと、この特定のケースで期待する結果が得られますが、 perlfuncのドキュメントeofの最後にあるアドバイスに注意してください。

実用的なヒント:入力演算子は通常、データが不足した場合、またはエラーが発生した場合にeof返されるため、Perlで使用する必要はほとんどありません。undef

コマンドは最大で1行を生成するので、スカラーに貼り付けます

chomp(my $gotwin = `tail -n 1 $file | grep win`);

の終了ステータスはgrep、パターンが一致したかどうかを示していることに注意してください。

2.3終了ステータス

通常、終了ステータスは、選択した行が見つかった場合は0、それ以外の場合は1です…</ p>

また、tail成功した場合は0を終了し、失敗した場合はゼロ以外を終了します。その情報を活用してください。

#! /usr/bin/perl

use strict;
use warnings;

my $file = "input.dat";
chomp(my $gotwin = `tail -n 1 $file | grep win`);

my $status = $? >> 8;
if ($status == 1) {
  print "$0: no match [$gotwin]\n";
}
elsif ($status == 0) {
  print "$0: hit! [$gotwin]\n";
}
else {
  die "$0: command pipeline exited $status";
}

例えば:

$> input.dat
$ ./prog.pl
./prog.pl:一致なし[]
$ echo win> input.dat
$ ./prog.pl
./prog.pl:ヒット![勝つ]
$ rm input.dat
$ ./prog.pl
tail:読み取り用に `input.dat'を開くことができません:そのようなファイルまたはディレクトリはありません
./prog.pl:一致なし[]
于 2010-05-10T15:01:27.840 に答える
1
open (PS,"tail -n 1 $file|");
if($l=<PS>)
  {print"$l"}
else
  {print"$file is empty\n"}
于 2010-05-10T11:59:36.487 に答える
-1

まあ...これをスクラッチ...私は実際にパイプの出力であるファイルハンドルについての接続を確立しませんでした。

statを使用してファイルのサイズを決定する必要がありますが、最初にファイルがフラッシュされることを確認する必要があります。

#!/usr/bin/perl

my $fh;
open $fh, ">", "foo.txt" or die "cannot open foo.txt - $!\n";

my $size = (stat $fh)[7];
print "size of file is $size\n";

print $fh "Foo";

$size = (stat $fh)[7];
print "size of file is $size\n";

$fh->flush;

$size = (stat $fh)[7];
print "size of file is $size\n";

close $fh;
于 2010-05-10T13:02:21.003 に答える