}
パペット ファイル (.pp) がオプションの改行で終わっていることを確認したいと思います。
私が気にするのは終了コードだけです。
これを行う方法はありますか?
フラグを使用できます。行が } で終わる場合、または行が空の場合は、1 に設定します。ファイルの終わりの後、最後のフラグ セットを取得します。
my $ok;
while (<>) {
if (/}\s*$/) {
$ok = 1;
} else {
undef $ok unless /^\s*$/;
}
}
die unless $ok;
perl -ne 'unless(/^[\s]*$/){$x=$_;}if(eof){if($x=~m/\}[\s]*$/){print "match\n"}}' your_file
以下でテスト:
ファイルの最後に空の改行がいくつかあり、それらの空の改行の1つにもスペースがあります。
> cat temp2
this is key2
this is key1
this is key1
this is key1
this key2 kmkd
}
実行:
> perl -ne 'unless(/^[\s]*$/){$x=$_;}if(eof){if($x=~m/\}[\s]*$/){print "match\n"}}' temp2
match
perl -ne 'undef$/;print"} at end\n"if$_=~/}\s*+$/' FILENAME
このソリューションはあなたのために働くはずです。基本的に、最後の非空白行が中括弧とそれに続くオプションの空白で終わったかどうかを示すフラグを保持します。コマンドラインのパラメーターとして入力ファイルが必要です。
use strict;
use warnings;
my $valid = 0;
while (<>) {
$valid = /\}\s*$/ if /\S/;
}
print $valid ? "File is OK\n" : "File is invalid\n";
ファイルが大きすぎない場合は、次のようにすることができます。
{
#Set input record separator to undefined; reads in everything as one line.
local $/;
#FILE is a filehandle you have already opened.
print "Happy ending!" if (<FILE> =~ /}\n*$/s);
}
このメソッドは、ファイル全体を単一の文字列に読み取るため、探しているものを正規表現と簡単に一致させることができます。
(この方法は簡単ですが、ファイル全体をメモリに読み込まないため、大きなファイルがある場合は、choroba のアプローチの方が優れています。)