2013-02-13 82 views
1

想要從具有多個數字的變量中精確地匹配數字,該數字由與egrep.below相似的管道符號分隔,這是我嘗試的代碼。perl匹配與egrep類似的變量中的多個數字

#!/usr/bin/perl 

my $searchnum = $ARGV[0]; 

my $num = "148|1|0|256"; 
print $num; 

if ($searchnum =~ /$num/) 
{ 
    print "found"; 
} 
else 
{ 
    print "not-found"; 
} 

預期O/P

perl number_match.pl 1 
found 
perl number_match.pl 1432 
not-found 
+0

您的代碼與給定的一組數字的工作,並沒有得到你的闕,你想使它通用? 。 – 2013-02-13 10:16:26

+0

@ashu當我運行perl number_match 1432其返回發現,我應該找不到,我想匹配整個數字說例子1應該匹配1不是148因爲1是可用的148 – 2013-02-13 10:25:25

回答

2

/148|1|0|256/比賽如果此正則表達式被綁定到字符串中包含的子要麼是14810256的正則表達式。這意味着選項148是多餘的,因爲它匹配匹配1的字符串子集。

您可能想要測試給定字符串是否等於這些選項之一。如果你想使用正則表達式,你必須錨定在開始的正則表達式和字符串的結尾:

/^ (?:148|1|0|256) $/x 

您也可以使用grep內置:

my $number = ...; 
if (grep {$number eq $_} qw/148 1 0 256/) { say "found"  } 
else          { say "not-found" } 

grep功能需要必須返回布爾值的塊。它返回條件返回true的右側列表中的所有元素。如果至少有一個元素匹配,那麼整個表達式的計算結果爲true。

你也可以使用一個包含所有可能的選項哈希:

my $number = ...; 
my %options = map { $_ => undef } qw/148 1 0 256/; 
if (exists $options{$number}) { say "found"  } 
else       { say "not-found" } 

這比grep更有效。

1

用途:

my $num = '^(148|1|0|256)$'; 

這裏是一個oneliner:

perl -e "$_=$ARGV[0]; exit if !/^\d+$/; print \"not-\" unless /^(14|156|0|89)$/;print \"found\n\";" 
+0

這甚至不會編譯 - '$''是數組插入的列表分隔符 – amon 2013-02-13 11:13:47

+0

@amon正確,應該是反斜槓或單引號,我將編輯它 – ilomambo 2013-02-13 11:15:31

+0

這裏是一個oneliner:>> perl -e「$ _ = $ ARGV [0] ;退出if!/^\ d + $ /;打印\「不 - \」除非/ ^(14 | 156 | 0 | 89)$ /;打印\「發現\ n \」;「14 – ilomambo 2013-02-13 11:32:09