为什么单个数字无法匹配数组中的Range对象?

时间:2019-12-12 13:27:56

标签: raku

> my @numbers = 1, 3, 5;
> 1 ~~ /@numbers/; # 
「1」

与以下相同:

> 1 ~~ /1 | 3 | 5/
「1」

但是当元素是 Range 对象时,它无法匹配:

> my @ranges = 1..3.item, 4..6.item;
[1..3 4..6]

> 1 ~~ /@ranges/
Nil
> 1 ~~ /|@ranges/
Nil
> 1 ~~ /||@ranges/

2 个答案:

答案 0 :(得分:4)

当正则表达式引擎看到#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:2 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-KEY:METHOD=AES-128,URI="https://xxxx/xxxx/xxxxx/x/xxxxx/xxxxxx/xxxxxx.key",IV=0x4d347130965af9bba4349829013bb440 #EXTINF:2.000000, 1_1080p_000.ts #EXTINF:2.000000, 1_1080p_001.ts #EXTINF:2.000000, 1_1080p_002.ts #EXTINF:2.000000, … . 时,它将像对待数组元素的交替一样对待,因此前两个示例是等效的。

我相信/@numbers/并没有这样的自动性。

编辑:别在下面,我一开始完全误解了这个问题。

Range

看到了吗? > my @ranges = 1..3, 4..6; [1..3 4..6] > 1 ~~ @ranges[0]; True > 2 ~~ @ranges[1]; False > 4 ~~ @ranges[1]; True > @ranges.first( 5 ~~ * ) 4..6 是一个范围数组(您对@ranges的调用在这里没有任何作用)。 理论上如果smartmatch运算符更聪明,则此将会成立。

item

平移也无济于事,因为范围的平面列表仍然是范围的列表。

可以对范围本身进行修饰,但这只是将它们变成数组

> 1..3 ~~ @ranges;
False

答案 1 :(得分:2)

  

为什么单个数字不能与数组中的Range对象匹配?

the doc

  

[数组的]单个元素的插值规则与标量的插值规则相同

并且根据同一文档部分,标量(不是正则表达式)的规则为:

  

内插字符串值

诸如1..3之类的范围对象会字符串化为1 2 3

my $range = 1..3;
put $range;                   # 1 2 3
put so '1'     ~~ / $range /; # False
put so '1 2 3' ~~ / $range /; # True

因此,正如霍利(Holli)所建议的那样:

my @ranges = flat 1..3, 4..6;
say @ranges;        # [1 2 3 4 5 6]
say 1 ~~ /@ranges/; # 「1」

还是有某些您不想要的原因? (另请参阅Scimon对Holli答案的评论。)