Perl多线模式匹配使用grep

时间:2016-04-26 21:39:51

标签: regex perl

这是我的脚本,用于检查文件中是否存在版权。

use strict;
use warnings;
use List::Util 'first';

my $filename="sample.txt"; # this file name will be passed-in to the script.
my @fileContent=`cat $filename`;
my $copyrightFound = first { /copyright .* Shakespeare/i } @fileContent;
if (!$copyrightFound) {
   print "\nERROR: Copyright missing\n";
   exit;
}
#copyright Found
print @fileContent;
if (grep /Copyright (c) \d+ by Bill Shakespeare\nAll rights reserved./,@fileContent ) {
  print "\nCopyright is good\n";
} else {
  print "\nCopyright needs to be fixed\n";
}

打印:

$ perl copyrightCheck.pl 
Copyright (c) 2010 by Bill Shakespeare
All rights reserved.


Copyright needs to be fixed

但版权是好的,有没有更好的方法来检查这个?或者我的grep命令有什么问题? All rights reserved.也可以显示在同一行或下一行,我可以使用\n*来检查相同的内容吗?

1 个答案:

答案 0 :(得分:1)

问题是您将文件加载到文件行的数组中,因此Copyright (c) 2010 by Bill ShakespeareAll rights reserved.最终会出现在单独的数组元素中。然后尝试匹配此阵列元素上的多行版权字符串,该字符串失败。

要解决此问题,您可以尝试将文件加载到标量中,并在该标量上使用正则表达式匹配。您还需要转义要匹配的任何括号:

my $fileContent = `cat $filename`;
...
if ($fileContent =~ /Copyright \(c\) \d+ by Bill Shakespeare\nAll rights reserved./)
{
    ...
}

我还建议你使用Perl的open函数和<>运算符将文件的内容加载到变量。