规范的一部分说"有些名字很特别,例如Hughie,Dewey,Louis和Donald.在项目的整个生命周期中,可以随意添加其他名称.每当你输入其中一个名字时,请玩quack.wav."
我可以写......
while (<>) {
if ($_ =~ /Hughie|Dewey|Louis/) {
quack() ;
}
elsif ($_ =~ /Donald/ {
quack() ;
you_re_fired_apprentice() ; # Easter egg don't tell QA
}
}
Run Code Online (Sandbox Code Playgroud)
...但是虽然要实施,但它看起来是WTF-y:二进制搜索在哪里?如果鸭子名字的数量突然大幅增加怎么办?它根本不会扩展!
我可以在临时目录中使用这些名称创建空文件,然后使用"文件存在"API,但这看起来很迂回,我必须确保它们最后被删除.
当然有更好的方法吗?
你可以写,但你应该这样写:
my %ducks = map {$_ => 1} qw(Hughie Dewey Louis);
while (<>) {
if ($ducks{$_}) {
quack() ;
}
elsif ($_ eq 'Donald') {
quack() ;
you_re_fired_apprentice() ; # Easter egg don't tell QA
}
}
Run Code Online (Sandbox Code Playgroud)
创建哈希只需要一点时间,但不能超过O(n)
.O(1)
但是使用哈希进行查找,因此它比顺序搜索(通过grep或带有替换的正则表达式)更有效,假设您将检查多于一个或两个项目.
顺便说一下,你拥有的正则表达式将与搜索字符串中的任何位置匹配.如果想要完全匹配,则需要添加起始锚点和结束锚点.
或者,您可以使用智能匹配
my @ducks = qw(Hughie Dewey Louis);
my $name = 'Dewey';
say 'smart match' if $name ~~ @ducks;
Run Code Online (Sandbox Code Playgroud)
这是switch语句使用的内容,因此您可以编写
given ($name) {
when (@ducks) {
quack();
}
when ('Donald') {
quack();
you_re_fired_apprentice(); # Easter egg don't tell QA
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Perl Hash。另请参阅如何在 Perl 中表示集合?和在 Perl 中表示集合。
使用哈希来实现集合并不完全漂亮,但它应该很快。