regex - 有没有更好的方法用/x 编写 Perl 正则表达式,这样代码仍然易于阅读?

标签 regex perl perl-critic

我在我的一个脚本上运行 Perl::Critic,并收到以下消息:

Regular expression without "/x" flag at line 21, column 26. See page 236 of PBP.

我查了保单信息here ,并且我知道在扩展模式下编写正则表达式将对任何查看代码的人有所帮助。

但是,我被困在如何将我的代码转换为使用/x 标志。

CPAN 示例:
# Match a single-quoted string efficiently...

m{'[^\\']*(?:\\.[^\\']*)*'};  #Huh?

# Same thing with extended format...

m{
    '           # an opening single quote
    [^\\']      # any non-special chars (i.e. not backslash or single quote)
    (?:         # then all of...
        \\ .    #    any explicitly backslashed char
        [^\\']* #    followed by an non-special chars
    )*          # ...repeated zero or more times
    '           # a closing single quote
}x;

如果您只查看正则表达式,这是有道理的。

我的代码:
if ($line =~ /^\s*package\s+(\S+);/ ) {

我不确定如何在 if 语句中使用扩展的正则表达式。我可以这样写:
    if (
        $line =~ /
        ^\s*    # starting with zero or more spaces
        package
        \s+     # at least one space
        (\S+)   # capture any non-space characters
        ;       # ending in a semi-colon
        /x
      )
    {

这有效,但我认为这几乎比原版更难阅读。有没有更好的方法(或最佳实践方法)来写这个?我想我可以使用 qr//创建一个变量。

我并不是真的在寻找关于重写这个特定正则表达式的建议(尽管如果我能改进它,我会接受建议) - 我更多的是寻找关于如何在 if 语句中扩展正则表达式的建议。

我知道 Perl::Critic 只是一个指导方针,但遵循它会很好。

提前致谢!

编辑:
因此,在收到一些答案后,我很清楚,并不总是需要使用注释制作正则表达式多行。了解基本正则表达式的人应该能够理解我的示例在做什么 - 我添加的评论可能有点不必要和冗长。我喜欢使用扩展正则表达式标志的想法,但仍然在正则表达式中嵌入空格以使正则表达式的每个部分更加清晰。
感谢所有的投入!

最佳答案

好吧,我真的不认为你应该在这个上浪费垂直屏幕的空间。另一方面,如果我将这个模式写成多行,我会使用大括号并缩进模式:

if ($line =~ m{
        \A \s*
        package
        \s+
        (\S+)
        \s* ;
    }x 
) {

恕我直言,以下版本完全没问题:
if ( $line =~ m{ \A \s* package \s+ (\S+) \s* ; }x  ) {

在获得m//x的好处方面.

在这种情况下,注释完全没有必要,因为您没有做任何棘手的事情。我确实添加了 \s*在分号之前,因为有时人们会将分号与包名分开,这不应该破坏您的匹配。

关于regex - 有没有更好的方法用/x 编写 Perl 正则表达式,这样代码仍然易于阅读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/987438/

相关文章:

regex - 如何在 Perl 标量中只保留前五行?

perl - 当我处理带有文件句柄的多行字符串时,如何避免 Perl::Critic 警告?

perl - 模块以 "1;"结尾,perlcritic 提示它没有

regex - 删除之间没有空格的方括号

java - 将 String 替换为另一个直到行尾

javascript - 用于检查全名的正则表达式

regex - 查找并修复分成两行的括号

perl - 为什么我的 Catalyst 应用程序无法读取我的 Template Toolkit 文件?

Perl 作用域 - 在子例程中访问变量

perl - 我是否需要在调用 Win32::OLE->LastError 时捕获错误?