最近,我对正则表达式变得友好,并使用它们非常有效地完成了许多任务。与大多数perl一样,TIMTOWTDI使我的判断蒙上阴影。有时我可以使用相等运算符或绑定运算符。但有时候使用一个比另一个更合适吗?
首先是简化案例
my $name = 'Chris';
if ($name eq 'Chris') { print 'What a great name!'; }
if ($name =~/^Chris$/) { print 'Yip sure is a great name; }
所以在这种情况下,这是最简化的,使用相等的输入更少,但是在这个简化的例子中,对于其中一个有任何好处。
稍微复杂的例子
my $name = 'Christopher';
if ($name eq 'Chris' || $name eq 'Christopher') { print 'What a great name!'; }
if ($name =~ /^Chris(?:topher)?$/) { print 'Yip sure is a great name; }
这里绑定操作符输入较少。但是我不确定这个好处是否可能会占据另一个好处。
一般规则是,如果要将整个字符串与固定值匹配以使用相等运算符,并且如果匹配带有模式的字符串(例如任何5位数字符串/\d{5}/
),则使用绑定运算符。
在上面的例子中使用绑定运算符是不合适的。我很欣赏这些例子只是弥补,可能无法反映现实生活中的问题。然而,我想到的是试图解释我的问题。
答案 0 :(得分:5)
然而,在这个简化的例子中,对于其中一个或那个有任何好处。
嗯,他们并不等同。 /^Chris$/
匹配Chris
和Chris
后跟换行符。
如果您使用了等效模式(/^Chris\z/
),那么差异就是性能。单个字符串比较将比正则表达式匹配更快。它也更清晰。
对于更复杂的比较,您通常希望使用更简单,更清晰,更易于维护的内容。当它成为一个问题时,通过使用配置文件和运行基准来解决性能问题。
答案 1 :(得分:3)
我期望从eq
运算符获得更好的性能(如果有的话),因为正则表达式在确定之前可能需要编译阶段和分析。
所以在这种情况下:
if ($name eq 'Chris') { print 'What a great name!'; }
if ($name =~/^Chris$/) { print 'Yip sure is a great name; }
......我希望第一个声明最快。
但是,在第二个示例中,您必须考虑已提供逻辑OR的失败案例的总和时间:
if ($name eq 'Chris' || $name eq 'Christopher') { print 'What a great name!'; }
if ($name =~ /^Chris(?:topher)?$/) { print 'Yip sure is a great name; }
......这里的东西不那么切割和干燥。当然,eq
可能会更快,但是比正则表达式快两个eq
,而不需要回溯(在此示例中)?我不能这么肯定。
通常您不必考虑性能优势。所以你不能说一个人比另一个人“更好” - 在这种情况下我通常会鼓励代码清晰。但重要的是要认识到eq
是非常无情的,而正则表达式非常灵活 - 允许不区分大小写的搜索,只停留在开头等等。当你做命中一些代码时哪个比较速度至关重要,最终你会想要进行基准测试。
答案 2 :(得分:1)
正则表达式的力量在其可变性中得以实现 当您为正则表达式引擎提供模板时,您“建议”匹配引擎的结果 一般来说,它与C“strncmp()”相同,就像在Perl中那样,即:$ str eq“asdf”,两者都是模板。
但是,你不能用一种语言很好地描述变量,这就是为什么存在正则表达式引擎的原因。
“引导”引擎有一个开销,即:重置变量,状态跟踪等。
但在那之后,引擎将胜过任何语言结构组合
相信的。不是一点点,而是一个巨大的,巨大的百分比。