何时使用等于运算符的绑定运算符

时间:2013-10-27 20:23:35

标签: regex perl equality

最近,我对正则表达式变得友好,并使用它们非常有效地完成了许多任务。与大多数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}/),则使用绑定运算符。

在上面的例子中使用绑定运算符是不合适的。我很欣赏这些例子只是弥补,可能无法反映现实生活中的问题。然而,我想到的是试图解释我的问题。

3 个答案:

答案 0 :(得分:5)

  

然而,在这个简化的例子中,对于其中一个或那个有任何好处。

嗯,他们并不等同。 /^Chris$/匹配ChrisChris后跟换行符。

如果您使用了等效模式(/^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”,两者都是模板。

但是,你不能用一种语言很好地描述变量,这就是为什么存在正则表达式引擎的原因。

“引导”引擎有一个开销,即:重置变量,状态跟踪等。
但在那之后,引擎将胜过任何语言结构组合 相信的。不是一点点,而是一个巨大的,巨大的百分比。