我想检查我的木偶文件(.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
测试如下:
文件末尾有一些空换行符,其中一个空换行符也有空格。
> 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
如果文件不是太大,你可以这样做:
{
#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 的方法会更好,因为它不会将整个内容读入内存。)
该解决方案应该适合您。本质上,它保留一个标志,说明最后一个非空白行是否以大括号结尾,后跟可选空格。它期望输入文件作为命令行上的参数。
use strict;
use warnings;
my $valid = 0;
while (<>) {
$valid = /\}\s*$/ if /\S/;
}
print $valid ? "File is OK\n" : "File is invalid\n";