2014-10-28 94 views
2

我需要能夠將用戶與用戶列表進行匹配,但只能匹配完全匹配。 在下面的代碼示例中:
- 如果strUser包含「info」,則表示匹配,這很好。
- 如果strUser包含「theinfo」或「infostuff」,則表示匹配不成功。
我無法使用\ b修飾符,因爲變量將只包含用戶名,不包含空格或單詞邊界。perl僅與數組列表匹配整個單詞

#!/usr/bin/perl 
$strUser = "theinfo"; 
$strUsers = "(alpha|info|omega)"; 
if ($strUser =~ /$strUsers/) { 
print "match\n"; 
} 
exit(0); 
+0

由於微不足道而關閉。 (OP使用'「\ b」'代替'「\\ b」'來創建一個由'\ b'組成的字符串,這個問題在'使用警告'中是明顯的) – ikegami 2014-10-28 15:43:46

+0

由於答案的有用性而被撤銷。 – ikegami 2014-10-28 15:50:47

+1

不使用'use strict;使用警告;'就像在黑暗中駕駛你的汽車沒有前燈和安全帶:你不太可能會死亡和死亡,你只是不知道它,直到它發生。 – TLP 2014-10-28 15:51:39

回答

4

使用邊界您正則表達式^\z內:

if ($strUser =~ /^$strUsers\z/) { 

注意,因爲你可能想用文字字符串上班,我會投入更多的精力投入到使用quotemeta構建你的正則表達式:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $strUser = "theinfo"; 

my @users = qw(alpha info omega); 

my $list_users_re = join '|', map {quotemeta} @users; 

if ($strUser =~ /^($list_users_re)\z/) { 
    print "match\n"; 
} 

exit(0); 

然而,一種更簡單的解決方案,因爲你正在尋找精確的匹配,僅僅是使用哈希:

my @users = qw(alpha info omega); 

my %is_user = map { $_ => 1 } @users; 

if ($is_user{$strUser}) { 
    print "match\n"; 
} 

最後,總是包括use strict;,並在每perl腳本use warnings

+0

謝謝...那工作...早些時候我嘗試在$ strUsers中使用\ b,我應該在if語句中使用它。當時間到了的時候會接受答案。 – 2014-10-28 15:42:08

+1

@Xi Vix,'\ b'也在'$ strUsers'中工作。你可能忘了逃避'\'。始終使用'use strict;使用警告;'。 – ikegami 2014-10-28 15:42:52

+0

Ahhhhhh,ty @ikegami。沒有想到這一點。將包括在我的精煉。 – Miller 2014-10-28 15:51:42