Как обычно, ответ @raiph правильный. Я просто хочу внести минимальные изменения в вашу программу, чтобы все было правильно. В этом случае просто добавьте индексы в оба цикла, чтобы сделать вещи более понятными. Вы использовали контекстную переменную $ _ в первом и $ ^ a во втором (внутреннем), и это становилось излишне запутанным.
my @s=<1 1 2 2 1 3>;
my $k=2;
my $res=0;
for ^@s -> $i {
my $seen = 0;
my %window;
for @s[$i..*] -> $c {
if $c == %window.keys.none {
$seen++;
%window{$c} = 1;
} else {
%window{$c} += 1;
}
if %window{$c} == $k {
$seen--;
if $seen == 0 {
$res++;
}
} elsif %window{$c} > $k {
last;
}
}
}
say $res;
Как видите, помимо попытки сделать отступ немного точнее, единственное дополнительное - это добавить -> $i
и -> $c
, чтобы циклы были проиндексированы, а затем использовать их там, где вы использовали неявные переменные.