![](/img/trans.png)
[英]What does this mean in regular expressions? re.match(r“(^[cf-qs-z]+)”, any file name)?
[英]What does Any.match do?
它有一個欺騙性的簡單代碼:
method match(Any:U: |) { self.Str; nqp::getlexcaller('$/') = Nil }
但是,這是它的行為:
(^3).match(1) # OUTPUT: «「1」»
到現在為止還挺好。
say (1,3 ... * ).match(77); # OUTPUT: «Nil»
Ooookey。 現在發生了什么?
say (1,3 ... * ).match(1); # OUTPUT: «Nil»
say (1,3 ... * ).match(/\d/); # OUTPUT: «Nil»
不喜歡序列。
say (^10).match(/\d/); # OUTPUT: «「0」»
好的,再次有意義。
say <a b c>.match(/\w/); # OUTPUT: «「a」»
恢復正常。 它不喜歡Seqs嗎? 我假設,因為我查看了其他類的代碼並且match
沒有重新實現,所有這些都調用了該代碼。 但是我沒有看到如何返回字符串並從NPQ設置變量,或者為什么它不能用於序列。
.match
是在單個haystack字符串中搜索一個針。 無限序列字符串為'...'
。
say (1,3 ... 9).Str; # 1 3 5 7 9
say (1,3 ... 9).match: '1'; # 「1」
say (1,3 ... *).Str; # ...
say (1,3 ... *).match: '.'; # 「.」
首先,您正在查看錯誤的方法定義:
method match(Any:U: |) { ... }
Any:U
有點像Any $ where not .defined
除非它匹配你會得到錯誤消息“參數'<anon>'例程'匹配'必須是'任何'類型的類型對象,而不是對象實例。 ..“。
但是你傳遞了一個定義的 Seq
。 因此,您的.match
調用不會調度到您正在查看的方法定義。
要找出方法調度的內容,請使用:
say (1,3 ... *).^lookup('match').package ; # (Cool)
因此, 定義的 Seq
將分派給Cool
代碼 :
method match(Cool:D: |c) {
...
self.Stringy.match(|c)
}
那么,下一個:
say (1,3 ... *).^lookup('Stringy').package ; # (Mu)
和代碼 :
multi method Stringy(Mu:D $:) { self.Str }
所以檢查:
say (1,3 ... *).Str; # ...
答對了。
並確認:
say (1,3 ... *).match: '.'; # 「.」
接受的答案完全解釋了發生了什么。 我只是添加這個來展示如何做OP似乎有意的事情的一些例子。
doug$ perl6
To exit type 'exit' or '^D'
> say (^3).any.match(/\d/)
any(「0」, 「1」, 「2」)
> say (^3).any.match(/\d/).so
True
> say (^3).any.match(/ <alpha> /).so
False
> say ('a'..'c').any.match(/ <alpha> /).so
True
> # say (0 ... *).any.match(/ \d /).so ## ==> never terminates
Nil
> say (0 ... *).first(/ \d /)
0
> say (0 ... *).first(/ \d\d /)
10
>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.