2010-06-30 74 views
5

使用我通常的 'X' 用法是:质朴的 'X' 在Perl

print("#" x 78, "\n"); 

哪个地连接了字符串78倍 “#”。但最近我遇到了这个代码:

while (<>) { print if m{^a}x } 

它打印输入的每一行开头的“A”。我理解正则表达式匹配部分(m {^ a}),但我真的不明白'x'在这里做什么。

任何解释将不胜感激。

回答

18

这是修饰符的正则表达式。 x修饰符告诉perl忽略正则表达式中的空格和注释。

在你的示例代码中,它没有区别,因为在正则表达式中没有空格或注释。

+0

谢谢各位的明确的解释。 – 2010-06-30 14:36:33

+1

值得一提的是,你可以通过'perldoc perlre'获得这个信息。它甚至在第一页上! – leander 2010-06-30 16:16:01

5

在这个用例中,'x'是一个正则表达式修饰符,它“通过允许空格和注释扩展您的模式的易读性”。根据perl文档。但在这里看起来多余

+2

不是“冗余”,而是“不必要”。 – 2010-06-30 14:32:25

+3

@clintp:多余(意思是'不必要')和不必要的区别是什么? – 2010-06-30 14:37:41

+1

'冗余'并不仅仅意味着'不必要'。这意味着'不必要的,因为别的东西可以达到同样的目的'。在这种情况下,没有任何其他信息告诉正则表达式忽略空白/评论。没有任何空白/评论,所以没有必要忽略它们。 – pkaeding 2010-06-30 14:42:33

6

第一种情况下的“x”是一个重复操作符,它将字符串作为左侧参数,并将重复次数作为正确参数。 Perl6可以使用“xx”重复操作符复制列表。

第二个示例使用正则表达式m{^a}x。虽然您可能会使用许多不同类型的分隔符,但新手可能会喜欢使用熟悉的符号,该符号使用正斜杠:m/^a/x

正则表达式中的“x”被称为修饰符或标志,可能使用的可选标志。它用于忽略正则表达式模式中的空白,但它也允许使用正常的注释。由于正则表达式模式可能会变得非常漫长和令人困惑,因此使用空格和注释非常有帮助。

你的例子非常短(如果该行的第一个字母是以“a”开头的话),所以你可能不需要空格或注释,但是如果你想的话可以。


例子:

m/^a  # first letter is an 'a' 
     # <-- you can put more regex on this line because whitespace is ignored 
     # <-- and more here if you want 
/x 
+0

感谢vol7ron,我不知道你可以用正则表达式 – 2010-07-04 17:31:14