Perl6:是否只有当你从循环中退出时才会运行的移相器?

时间:2016-03-20 17:52:23

标签: perl6

获取此示例代码:

#!/usr/bin/env perl6

use v6.c;

ROLL:
for 1..10 -> $r {
    given (1..6).roll {
        when 6 {
            say "Roll $r: you win!";
            last ROLL;
        }
        default {
            say "Roll $r: sorry...";
        }
    }
    LAST {
        say "You either won or lost - this runs either way";
    }
}

我希望能够区分掉出循环而明确说出last。 理想情况下,这是一个移植器,但据我所知,在任何一种情况下都只有LAST

有优雅的方法吗? (优雅,所以不添加$won变量。)

2 个答案:

答案 0 :(得分:5)

我们正在处理Perl,所以有多种方法可以做到这一点;其中一个使用主题变量$_来保留值,以便我们可以轻松地重复匹配它:

constant N = 5;
for flat (1..6).roll xx * Z 1..N -> $_, $n {
    print "roll $n: $_ ";

    when 6 {
        put "(won)";
        last;
    }

    default {
        put "(lost)";
    }

    LAST {
        print "result: ";
        when 6 { put "winner :)" }
        default { put "loser :(" }
    }
}

答案 1 :(得分:1)

这是另一种方法。优雅?我认为合情合理。不过,我希望有一个单独的移相器。

#!/usr/bin/env perl6

use v6.c;

constant MAX_ROLLS = 10;

ROLL:
for 1..MAX_ROLLS+1 -> $r {
    last ROLL if $r > MAX_ROLLS;

    given (1..6).roll {
        when 6 {
            say "Roll $r: you win!";
            last ROLL;
        }
        default {
            say "Roll $r: sorry...";
        }
    }

    LAST {
        say "You lost, better luck next time!" if $r > MAX_ROLLS;
    }
}