Perl 6 - do given
2016-11-19 本文已影响17人
焉知非鱼
昨晚我终于看了电影火星人。这是一部有趣的电影,看起来很多科学是扎实的。电影制作人仍然喜欢做的一件事是让计算机一次一个字地吐出信息,好像它们像电报一样到达。如果你想读取这样的文件,我建议使用电影文件阅读器。首先,我的长版本:
#!/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)他们允许程序员表现不同的水平和效率。