2010-06-30 72 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