> 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/
答案 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答案的评论。)