加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl中用于确定字符串变量是否与列表中的字符串匹配的惯用方法是

发布时间:2020-12-15 21:52:28 所属栏目:大数据 来源:网络整理
导读:规范的一部分说“有些名字很特别,例如Hughie,Dewey,Louis和Donald.其他名字可能会在项目的整个生命周期中随意添加.每当你输入其中一个名字时,请玩quack.wav.” 我可以写…… while () { if ($_ =~ /Hughie|Dewey|Louis/) { quack() ; } elsif ($_ =~ /Donald
规范的一部分说“有些名字很特别,例如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
    }
}

…但是,虽然要实施,但它看起来是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
    }
}

创建哈希需要一点时间,但不能超过O(n).使用哈希的查找是O(1),因此它比顺序搜索(通过grep或带有替换的正则表达式)更有效,假设您将检查多于一个或两个项目.

顺便说一下,你拥有的正则表达式将与搜索字符串中的任何位置匹配.如果想要完全匹配,则需要添加起始锚点和结束锚点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读