想要检查版权是否完全符合规定:
my $copyright_RE= '\s*[^\w]*\s*'."\QCopyright (c) \E".'(\d.*)'."\Q by Bill Shakespeare.\E".'\s*[^\w]*\s*\n*'.
'\s*[^\w]*\s*'."\QAll Rights Reserved.\E".'\s*[^\w]*\s*\n*'.
'\s*[^\w]*\s*'."\QGraw Hill publishers, Inc.\E".'\s*[^\w]*\s*\n*';
my $file_head=`head -n 100 /tmp/sample.txt`;
if ($file_head !~ /$copyright_RE/i) {
print "\nInvalid copyright, or copyright missing\n";
} else {
print "\ncopyright is good\n";
}
这样可行,但有更好的方法来指定" $ copyright_RE"和模式匹配?
sample.txt有:
# Copyright (c) 2008,2009-2011 by Bill Shakespeare. #
$ All rights reserved. $
* Graw Hill publishers, Inc. *
答案 0 :(得分:0)
我猜您可以使用qr//
和 x 选项进行预编译。
$copyright_RE = qr/
\s* [^\w]* \s*
\QCopyright (c) \E
( \d .* ) # (1)
\Q by Bill Shakespeare.\E
\s* [^\w]* \s* \n*
\s* [^\w]* \s*
\QAll Rights Reserved.\E
\s* [^\w]* \s* \n*
\s* [^\w]* \s*
\QGraw Hill publishers, Inc.\E
\s* [^\w]* \s* \n*
/xi;
但是,这个正则表达式在不匹配时会出现回溯问题。
最好限制回溯的灾难性潜力 我尝试用以下更改来做到这一点。
注意 atomic 组以及(?>)
另请注意,[^\w]
也匹配空格\s
也可以在正确的时候摆脱正则表达式中的所有\s
。
use strict;
use warnings;
$/ = undef;
my $copyright_RE = qr/
(?>
[^\w]*
\QCopyright (c) \E
( \d .* ) # (1)
\Q by Bill Shakespeare.\E
[^\w]*
\QAll Rights Reserved.\E
[^\w]*
\QGraw Hill publishers, Inc.\E
[^\w]*
)
/xi;
my $file_head = <DATA>;
print $file_head, "\n";
if ($file_head !~ /$copyright_RE/ ) {
print "\nInvalid copyright, or copyright missing\n";
} else {
print "\ncopyright is good ($1)\n";
}
__DATA__
# Copyright (c) 2008,2009-2011 by Bill Shakespeare. #
$ All rights reserved. $
* Graw Hill publishers, Inc. *
试一试。