Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using a loop's positional parameters inside an inner loop in Raku

Here is the code:

my @s=<a b c d>;
for @s.kv {
    for ($^k ... @s.elems) {
        printf("%s ", $^v);
    }
    printf("\n");
}

Expected output is:

# a b c d
# b c d
# c d
# d

But it gives this error (possibly among others)

key 0, val 1 Too few positionals passed; expected 2 arguments but got 1

It looks like the positional variables of the main loop $^k and $^v can't be used inside the inner loop. How to fix it? Thanks. Update: Typo inside inner loop fixed

like image 429
Lars Malmsteen Avatar asked Jan 07 '20 14:01

Lars Malmsteen


1 Answers

So for what you want to do I'd approach it like this :

my @s = <a b c d>;
for ^@s.elems -> $start-index {
    for @s[$start-index..*] -> $value {
        printf("%s ", $value );
    }
    print("\n");
}

Though really I'd do this.

my @s = <a b c d>;
(^@s.elems).map( { @s[$_..*].join(" ").say } )

Get the range from 0 to the number of elements in the array. Then the slice from there to the end for each, join on spaces and say.

A note on variables like $^k these are scoped to the current block only (hence why your above code is not working). Generally you only really want to use them in map, grep or other such things. Where possible I'd always advise naming your variables, this makes them scoped inside inner blocks as well.

like image 91
Scimon Proctor Avatar answered Sep 20 '22 16:09

Scimon Proctor