Perl 6 - do given

台词阅读

昨晚我终于看了电影火星人。这是一部有趣的电影,看起来很多科学是扎实的。电影制作人仍然喜欢做的一件事是让计算机一次一个字地吐出信息,好像它们像电报一样到达。如果你想读取这样的文件,我建议使用电影文件阅读器。首先,我的长版本:

#!/usr/bin/env perl6

sub MAIN (Str $file) {
    for $file.IO.lines(:chomp(False)) -> $line {
        for $line.comb -> $letter {
            print $letter;
            my $pause = do given $letter {
                when /<[.!?]>/ { .50 }
                when /<[,;]>/  { .20 }
                default        { .05 }
            }
            sleep $pause;
        }
    }
}

所以我在逐行读取给定的 $file 文件,告诉 Perl 不要 “chomp” 每一行(删除换行,这,BTW,你可以使用“nl-in”设置)。我“print”那些字母,而不是“put”,因为我不想换行。然后我需要使用 “sleep” 暂停,因为电脑的移动方式比人眼更快。要想知道睡眠的时间,我会检查字符的标点符号,以结束句子或引入暂停。我使用“<[]>”创建包含句点,感叹号和问号的字符类,或包含逗号或分号的字符类。 “do given”让我返回“given”语句的值,有效地将其转换为“given”运算符

我总是在 IRC 的 #perl6 频道上反弹我的想法,Zoffix 提出了这个更短的版本:

#!/usr/bin/env perl6

sub MAIN (Str $file) {
    for $file.IO.comb {
        .print;
        sleep  /<[.!?]>/ ?? .30
            !! /<[,;]>/  ?? .10
            !!              .05;
    }
}

这里我们将文件逐个字符读入默认的 “$ _” 主题变量,我们可以调用 “.print” 方法。然后,我们使用堆叠的三元运算符来休眠(也许在做梦),以找到多长时间。这个短得多,但对缺乏经验的人更加神秘。我喜欢这两个版本,因为 1)他们都能工作 2)他们允许程序员表现不同的水平和效率。

你可能感兴趣的:(Perl 6 - do given)