您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關perl如何判斷數組中是否含有某個元素,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
grep函數有兩個參數。一個代碼塊和一個列表。
對于列表中的每個元素,它的值會被賦到$_(Perl的標量默認值), 然后執行代碼塊。如果代碼塊的返回值是false,相應值被丟棄。如果代碼塊返回值是true, 相應值會作為返回值之一。
注意:代碼塊和第二個參數間沒有逗號!
看幾個grep的列子:
my @numbers = qw(8 2 5 3 1 7); my @big_numbers = grep { $_ > 4 } @numbers; print "@big_numbers\n"; # (8, 5, 7)
grep返回大于4的值,過濾掉不大于4的值。
my @files = glob "*.log"; my @old_files = grep { -M $_ > 365 } @files; print join "\n", @old_files;
glob "*.log"會返回當前文件所有.log為擴展名的文件。
-M $path_to_file 返回文件最后一次修改至今的天數。
這個例子過濾掉365天內修改的文件,并得到至少存在了一年以上的文件。
grep另一個有趣的應用是用來檢查在數組中是否包含某個元素。例如,你有一個名單,想知道給定的名字是否也在其中。
use strict; use warnings; my @names = qw(Foo Bar Baz); my $visitor = <STDIN>; chomp $visitor; if (grep { $visitor eq $_ } @names) { print "Visitor $visitor is in the guest list\n"; } else { print "Visitor $visitor is NOT in the guest list\n"; }
在這個例子中,grep函數位于標量上下文。在標量上下文中,grep返回通過過濾的元素個數。我們檢查的條件是$visitor是否與當前元素相等,grep會返回相等的次數。
如果返回值是0, 表達式則為false,如果是任何正數,表達式為true。
這種方法可以解決問題,但是因為它牽扯到上下文,可能對一些朋友不是很清晰。來看一下另外一個方案:List::MoreUtils模塊的any函數。
The any function has the same syntax as , accepting a block and a list of values, but it only returns true or false. True, if the block gives true for any of the values. False if none of them match. It also short circuits so on large lists this can be a lot faster.
any函數的語法和grep一樣,傳入一個代碼快和一個列表,但是僅返回true或false。如果任何值使代碼塊返回true, 則函數返回true;如果沒有匹配值則返回false。在處理過程中存在短路操作,所以對于規模較大的列表會快一些。
use List::MoreUtils qw(any); if (any { $visitor eq $_ } @names) { print "Visitor $visitor is in the guest list\n"; } else { print "Visitor $visitor is NOT in the guest list\n"; }
簡單說明一下:
我之前提到過,內建的grep函數是UNIX grep命令的一般化實現。
UNIX grep基于正則表達式過濾一個文件的每行內容。
Perl grep可以基于任何條件過濾任何列表。
下面Perl代碼是UNIX grep一個簡單的實現版本:
my $regex = shift; print grep { $_ =~ /$regex/ } <>;
第一行從命令行讀入一個正則表達式,命令行其它參數應該是文件名。
鉆石操作符<>從所有文件(命令行參數)中提取每一行。grep根據正則式進行過濾。通過過濾的行會打印出來。
Window沒有grep程序,不過你可以自己安裝一個或者使用上面的Perl腳本。
關于“perl如何判斷數組中是否含有某個元素”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。