前言
檢索一個字符串是否存在於一個數組中, 最主要的想法應該就是對數組進行循環, 逐個推斷數組的每一個元素值和給定的值是否相等。
(在Java語言還能夠把數組轉成 List , 在 list 中直接有 contains 方法能夠使用)
看一段簡單的代碼:
my @arr2 = qw(str1 str2 str3 str4); foreach(@arr2) { if($_ eq "str2") { print "str2 exist in Array!\n"; last; } }
這段代碼看起來挺簡潔,也不難理解。 可是在Perl 在還有第二種方法。僅僅須要一行代碼就能達成這種效果。 就是使用 grep 函數
grep 簡單介紹
grep 的全稱是 Global Regular Expression Print, 翻譯一下是全局正則表達式版本號。
假設使用過Linux命令的話對這個詞應該不陌生。
看一個常見的linux 命令
ps -ef | grep javaps -ef 是查看全部的進程
加上 grep java 的意思是 搜索系統進程中包括 java 名字的進程。
也就是說在linux 中, grep 能使用正則表達式搜索文本。 並把匹配的行打印出來。
觸類旁通, 在Perl 中 grep 函數的作用也相似
Perl grep 函數
在Perl 中 , grep 函數的調用方式有兩種:
方式1. grep BLOCK LIST
方式2. grep EXPT, LIST
BLOCK: 表示一個Code 塊, 通經常使用 {}表示;
EXPR 表示一個表達式。 一般是正則表達式
LIST: 要匹配的列表
grep函數對列表里的每一個元素進行BLOCK或EXPR匹配,它遍歷列表。並暫時設置元素為$_。
在列表上下文里,grep返回匹配命中的全部元素,結果也是個列表。
在標量上下文里,grep返回匹配命中的元素個數。
比較一下以下的代碼:
my @arr3 = qw(str1 str2 str3 str4 str11); my $str = "str1"; my $result =grep /^$str/, @arr3; my @result2 =grep /^$str/, @arr3; print "grep result=$result \n"; # 返回個數 print "grep result2=@result2 \n"; # 返回元素
這里在數組中匹配以str1 開頭的字符串元素
(提示 在正則表達是中:^-- 表示開頭 , $ 表示結尾 )
所以要精確匹配到某個字符串, 使用例如以下方式:
my $result =grep /^$str$/, @arr3;
到此 , 標題所給出的議題也就達成了。