我在我的一个脚本上运行了Perl::Critic,并收到了以下信息:
Regular expression without "/x" flag at line 21, column 26. See page 236 of PBP.
我查询了这里的策略信息,我明白在扩展模式下编写正则表达式将有助于查看代码的任何人。
然而,我卡在如何将我的代码转换为使用/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只是一个指导方针,但遵循它会很好。
提前感谢!
编辑:经过一些答案的解释,对我来说清楚了,使用注释将正则表达式拆分成多行并不总是必要的。了解基本正则表达式的人应该能够理解我的示例正在做什么-我添加的注释可能有点不必要和冗长。我喜欢使用扩展正则表达式标志的想法,但仍然嵌入正则表达式中的空格,以使每个部分的正则表达式更加清晰。感谢所有的建议!