You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl 6中如何正确获取上周五日期?为何&&运算符失效?

问题解析:为什么&&运算符在序列生成器的...右侧失效?

这个问题我之前处理日期序列匹配时也踩过类似的坑,核心原因是你混淆了「普通布尔逻辑表达式」和「序列匹配器的组合规则」,具体拆解如下:

1. &&在这里的行为和预期不符

你写的代码:

(Date.today, *.earlier(:1day) ... ( *.day-of-week==5 && *.week[1]+1==Date.today.week[1] )).tail

这里的&&是常规布尔逻辑运算符,它会把两个匹配器表达式(*.day-of-week==5和*.week[1]+1==Date.today.week[1])分别求值为布尔值,再返回两者的逻辑与结果。但序列生成器的...运算符右侧需要的是匹配器对象,而非布尔值。

当你传入布尔值时,序列生成器的判断逻辑会混乱:它可能误将“表达式返回true”当成停止条件,但由于布尔表达式的求值逻辑和匹配器的匹配逻辑不一致,导致它错误地停在了2018-05-06(周日)这个不满足条件的日期上。

2. Junction.all()才是正确的匹配器组合方式

根据你提到的文档,...右侧支持Junction类型,而Junction.all(matcher1, matcher2)是官方提供的复合匹配器创建方法,它的作用是明确告诉序列生成器:只有当元素同时满足所有传入的匹配器时,才停止序列迭代。

用Junction.all()改写后的代码,会正确地逐个检查每个日期是否同时是周五(day-of-week==5)、且周数+1等于今天的周数,最终精准定位到2018-05-04这个符合需求的日期。

补充:再梳理下你的需求逻辑

你的需求本质是:无论周一至周四,还是周六周日,都取最近的过去的周五,你用「周数+1等于今天周数」的条件已经能准确覆盖这个场景,搭配Junction.all()的复合匹配规则就能正常工作。

内容的提问来源于stack exchange,提问作者chenyf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:27:46