2013-10-27 21 views
2

時,我對正則表達式變得友好,並用它們非常有效地完成了許多任務。與大多數perl一樣,TIMTOWTDI也掩蓋了我的判斷。有時我可以使用平等運算符或綁定運算符。但是,有沒有更適合於使用其中一種?最近,當我使用相等運算符來約束運算符

首先被簡化的情況

my $name = 'Chris'; 
if ($name eq 'Chris') { print 'What a great name!'; } 
if ($name =~/^Chris$/) { print 'Yip sure is a great name; } 

因此,在這種情況下,這是最簡化的,其中使用平等是較少的鍵入,然而,在該簡化的例子是在那裏的一個或另一個的任何益處。

在稍微更復雜的例子

這裏的結合操作是打字以下。不過,我不確定這個好處要麼可能超過另一個。

所以是一般規則,如果你匹配一個固定值的整個字符串使用相等運算符,並且如果你匹配一個字符串與一個模式例如任何5位數字符串/\d{5}/然後使用綁定運算符。

在上面的例子中使用綁定運算符是不合適的。我明白,這些例子只是編寫而成,並不能反映真實的生活問題。然而,他們是我想要解釋我的問題的那些人。

回答

5

然而,在這個簡化的例子中,這對其中一個有什麼好處。

那麼,它們並不等同。 /^Chris$/匹配ChrisChris後跟一個換行符。

如果您使用過等效模式(/^Chris\z/),則差異將是性能。單個字符串比較將比正則表達式匹配更快。它也更清晰。

對於更復雜的比較,您通常想要使用更簡單,更清晰,更易維護的方法。當它成爲問題時,解決性能問題(通過使用配置文件和運行基準)。

+1

可維護性是這裏的關鍵問題,IMO。在這種情況下,我會在兩種情況下都使用'eq'選項,因爲它更好地傳達了開發人員的意圖。雖然我很欣賞學術討論,但這裏存在過早優化的真正風險。 @ikegami有專注:只有在你目睹問題時才進行優化。不過,聰明的人在開發時相對較早地進行壓力測試。 –

3

我希望eq運算符的性能稍微好一些(如果有的話),因爲正常表達式在作出決定之前可能需要編譯階段和分析。

所以在情況:

if ($name eq 'Chris') { print 'What a great name!'; } 
if ($name =~/^Chris$/) { print 'Yip sure is a great name; } 

...我希望第一個語句是最快的。

在第二個例子,但是,你必須要考慮的失敗的情況下,你所提供的邏輯或總結時間:

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 s比不需要回溯的正則表達式(在此示例中)更快?我不能確定。

通常您不必考慮性能優勢。所以你不能說一個比另一個「更好」 - 在這種情況下,我通常會鼓勵代碼清晰。但是要認識到eq是非常重要的,而正則表達式是非常靈活的 - 允許不區分大小寫的搜索,錨定到開始,等等。當你的碰到一些比較速度很關鍵的代碼時,我想要基準。

1

正則表達式的力量是通過其變化來實現的。
當你給一個正則表達式引擎一個模板時,你「建議」匹配引擎的結果。一般來說,它的C「strncmp()」和你要做的Perl一樣,即:$ str eq「asdf」,都是模板。

但是,不能用一種語言很好地描述可變性,這就是爲什麼存在正則表達式引擎。

有一個開銷「eterring」發動機,即:重置變量,狀態跟蹤等等。
但在那之後,發動機會超越語言的任意組合構建你可以
concieve的。不是一點點,而是一個巨大的,巨大的百分比。

+0

Poppycock。如果您創建了所有可能的匹配字符串的trie,它將踢正則引擎的屁股。人們使用正則表達式引擎是因爲通常不可行。 (太多的字符串,或太多的麻煩來維護一個計算結果。) – ikegami