问题描述
我有许多不同长度的清单。每个列表以一些数字开头,这些数字是多位数字,但以一个循环的1位数字结尾。例如:
my @d = <751932 512775 64440 59994 9992 3799 423 2 2 2 2>;
my @e = <3750 3177 4536 4545 686 3 3 3>;
我想找到一个1位数数字第一次出现的位置(对于@d
7和@e
5),而无需构造任何循环。理想情况下,lambda(或任何其他实际事物)应使用诸如$_.chars == 1
之类的条件遍历列表,并且一旦满足条件,它应停止并返回位置。与其重设职位,不如返回列表直到1位数字。欢迎更改和即兴创作。怎么做?
解决方法
您想要:k
上的first
修饰符:
say @d.first( *.chars == 1,:k ) # 7
say @e.first( *.chars == 1,:k ) # 5
有关更多信息,请参见first。
要回答问题的第二部分:
say @d[^$_] with @d.first( *.chars == 1,:k );
# (751932 512775 64440 59994 9992 3799 423)
say @e[^$_] with @e.first( *.chars == 1,:k );
# (3750 3177 4536 4545 686)
请确保使用with
以确保仅在first
实际找到条目时才显示切片。
有关更多信息,请参见with。