2017-06-03 52 views
7

假設我要與至少4個字母匹配的話,(並將它們存儲在一個陣列),我已經寫了下面的正則表達式,其正常工作:可變量詞

if ($text ~~ m:g/(\w ** 4..*)/) 
{ 
    my @words = $/; 
    ... 
} 

的量詞從被4無限制

**4..* 

現在,如果我嘗試用標量$ min_length替換4。既:

if ($text ~~ m:g/(\w ** $::min_length..*)/) 

和:

if ($text ~~ m:g/(\w ** <$::min_length>..*)/) 

導致錯誤在編譯: 量詞量化沒什麼

是否有對具有標爲量詞的方法嗎?

+0

錯誤消息是可怕的。如果您喜歡幫助開發者,請發送電子郵件至'[email protected]',其中有一些內容像「[LTA]」量化詞無法量化「的代碼實際上量化了某些內容,只是語法無效」一個包含此問題的最小版本的正文,您期望的那種消息以及Rakudo當前顯示的實際錯誤消息。 ('LTA',代表Less Than Awesome,這個術語在Perl 6世界中用於不完美的錯誤消息,這個錯誤消息距離完美100萬英里!) – raiph

+1

謝謝。我會。該錯誤消息有點神祕,是的,但至少它指出了正確的地方:) – Mikkel

回答

6

**量詞的右手側是不是一個數字或範圍文字,而是任意的Perl 6的表達,必須將其括在括號:

my $text = "The quick brown fox jumps over the lazy dog."; 
my $min-length = 4; 

my @words = $text.comb(/ \w ** {$min-length .. *} /); 

.say for @words; 

輸出:

quick 
brown 
jumps 
over 
lazy 
+1

雖然努力將此應用於m //,您的解決方案運行良好,以及它節省了我的if語句和額外分配線。 - 謝謝 – Mikkel

+0

@Mikkel如果你需要'if'語句,你也可以'if $ text.comb(/ ... /) - > @words {...}'或'如果$ text ~~ m:g/.../- > @words {...}' –

7

我認爲使用.split是一種更自然貼合,加上.grep

my $text = "The quick brown fox jumps over the lazy dog."; 
my $min-length = 4; 
say $text.split(/\W+/).grep(*.chars >= $min-length); 
=============== 
(quick brown jumps over lazy) 

如果定義的話當作空格之間的字符,你甚至可以使用.words方法:

say $text.words.grep(*.chars >= $min-length); 
=============== 
(quick brown jumps over lazy dog.) 
+0

'$ text.comb(/ \ w + /).grep(*.chars> = $ min-length);'也適用。對我來說,'split'在靜態分隔符的情況下感覺比'comb'更自然,否則這是一種雙重否定 - 「給所有單詞給予」比「給出所有不屬於不字。」 – smls

+0

@smls:好點:-) –