【发布时间】:2009-06-12 15:48:13
【问题描述】:
我在我的一个脚本上运行 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 只是一个指导方针,但最好遵循它。
提前致谢!
编辑: 因此,在收到一些答案后,我很清楚使用 cmets 制作正则表达式多行并不总是必要的。了解基本正则表达式的人应该能够理解我的示例在做什么——我添加的 cmets 可能有点不必要和冗长。我喜欢使用扩展正则表达式标志的想法,但仍然在正则表达式中嵌入空格以使正则表达式的每个部分更加清晰。 感谢您的所有意见!
【问题讨论】:
标签: regex perl perl-critic