![在 Perl oneliner 中具有严格和警告](https://linux22.com/image/66970/%E5%9C%A8%20Perl%20oneliner%20%E4%B8%AD%E5%85%B7%E6%9C%89%E4%B8%A5%E6%A0%BC%E5%92%8C%E8%AD%A6%E5%91%8A%20.png)
我真的很怀念use strict; use warnings
我的 Perl 俏皮话,例如:
perl -ne 'print unless /[0-5],[0-5]?|hernia|.{170,}|benz/' file`
特别是当我包含许多由 分隔的条件时|
。我注意到,当条件越多时,过滤就会变得越来越不稳定。
数据丢失或命令工作不稳定的示例
123.Symptoms of hernia are all, except: | happy | energetic | sleeping | down regulation of CNS hello | running 5
Signshello of mercedes benz car model: | Big tyres | Even bigger roller | Massive emergency of try | Hello world | All from above 1
其中正则表达式工作不稳定的两个条目。
如何在 Perl 语句中使用严格和警告?如何更好地设计这么长的条件语句?
答案1
如果你想要严格和警告,答案是“不要做一行”。几乎所有的衬垫都会受到 Perl 只写代码倾向的影响。
相反,将其展开为多线。如果你真的想要 - 你可以使用 HEREDOC 嵌入它
perl <<ENDPERL
use strict;
use warnings;
print "This is a test\n";
ENDPERL
或者:
perl -Mstrict -Mwarnings -e 'print something'
但实际上 - 这不会帮助您调试该正则表达式,因为 RE 不太可能触发警告。
对于较长的条件句,我会采取权宜之计 - 将其写下来,这样您就不必担心下次使用时会遗漏某些内容。您的示例看起来像一个“简单”的 grep -v 类型构造:
#!/usr/bin/perl
use strict;
use warnings;
my @patterns_to_skip = ( "hernia",
"ignshello", );
my $regex = join ( "|", map { quotemeta } @patterns_to_skip );
$regex = qr/$regex/;
while ( <> ) {
print unless m/$regex/;
}
答案2
perl -ne 'print unless /hernia|ignshello|...|n/' file
您提供的 RE 将匹配任何包含三个或更多字符 (the ...
) 的行或包含该字母的任何行n
。我认为这些不是故意的,但这可能就是您认为它“不稳定”的原因。
由于此行中没有任何变量,因此use warnings
和use strict
没有什么帮助。