Проблема в вашем конечном состоянии
*.day-of-week==5 && *.week[1]+1==Date.today.week[1]
Это две лямбда-выражения Wh независимоCode, каждый из которых принимает 1 аргумент.
*.day-of-week==5
*.week[1]+1==Date.today.week[1]
Поскольку объект кода является истинным значением, оператор &&
переходит ко второму. Таким образом, последовательность останавливается, когда она достигает воскресенья предыдущей недели.
Даже если бы код представлял собой одну лямбду, он не работал бы так, как вы ожидаете, поскольку это была бы лямбда, которая принимает два аргумента.
Правильный способ сделать эту проверку - использовать какой-то блок.
{.day-of-week==5 && .week-number+1 == Date.today.week-number}
Это может быть хорошей идеей, чтобы обернуть это в подпрограмму, чтобы вы могли проверить это.
sub last-friday ( Date:D $date ) {
# cache it so that it doesn't have to be looked up on each iteration
my $week-number = $date.week-number - 1;
(
$date,
*.earlier( :1day )
...
{
.day-of-week == 5
&&
.week-number == $week-number
}
).tail
}
say last-friday Date.new: :year(2018), :month( 5), :day( 9); # 2018-05-04
say last-friday Date.new: :year(2018), :month( 5), :day(12); # 2018-05-04
say Date.today.&last-friday; # 2018-05-04
Вы также можете просто рассчитать правильную дату.
sub last-friday ( Date:D $date ) {
$date.earlier:
days => (
$date.day-of-week # reset to previous sunday
+ 2 # go two days earlier to get friday
)
}
say last-friday Date.new: :year(2018), :month( 5), :day( 9); # 2018-05-04
say last-friday Date.new: :year(2018), :month( 5), :day(12); # 2018-05-04
say Date.today.&last-friday; # 2018-05-04