在 Perl oneliner 中具有严格和警告

在 Perl oneliner 中具有严格和警告

我真的很怀念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 warningsuse strict没有什么帮助。

相关内容