List::Util

簡介

List::Util 是一個實用的對列表進(jìn)行操作的功能函數(shù)工具集合侵浸。

use List::Util qw(
  reduce any all none notall first
  max maxstr min minstr product sum sum0
  pairs unpairs pairkeys pairvalues pairfirst pairgrep pairmap
  shuffle uniq uniqnum uniqstr
);

在List::Util 中包含的這些函數(shù),默認(rèn)情況下是不會被導(dǎo)入的。除非在use List::Util時明確指定。

從列表到單值的映射函數(shù)

以下介紹的所有函數(shù)都會處理一個列表并按要求返回一個單一的值。

reduce

$result = reduce { BLOCK } @list

遍歷列表妙啃,反復(fù)調(diào)用BLOCK,第一次調(diào)用BLOCK時把列表的前兩個元素分別設(shè)置為$a,$b俊戳;以后每次調(diào)用以上次次調(diào)用BLOCK的返回值為$a揖赴,以列表中的下一個元素為$b。直到列表中的所有元素處理完后抑胎,返回BLOCK的返回值燥滑。如果列表為空肾扰,則返回undef业稼。如果列表中只有一個元素,那么該元素被返回穴吹,BLOCK不被執(zhí)行。

以下代碼段演示了如何使用 reduce 函數(shù)實現(xiàn)本模塊中其他“從列表到單值映射的函數(shù)”羽历。(他們并不是這樣實現(xiàn)的焊虏,而是在單個C函數(shù)中以更有效的方式實現(xiàn)。)

$foo = reduce { defined($a) ? $a :$code->(local $_ = $b)? $b :undef } undef, @list # first
$foo = reduce { $a > $b ? $a : $b } 1..10       # max
$foo = reduce { $a gt $b ? $a : $b } 'A'..'Z'   # maxstr
$foo = reduce { $a < $b ? $a : $b } 1..10       # min
$foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr
$foo = reduce { $a + $b } 1 .. 10               # sum
$foo = reduce { $a . $b } @bar                  # concat
$foo = reduce { $a || $code->(local $_ = $b) } 0, @bar   # any
$foo = reduce { $a && $code->(local $_ = $b) } 1, @bar   # all
$foo = reduce { $a && !$code->(local $_ = $b) } 1, @bar  # none
$foo = reduce { $a || !$code->(local $_ = $b) } 0, @bar  # notall
# Note that these implementations do not fully short-circuit

如果您的算法需要讓reduce返回一個類型的值秕磷,那么請確保始終將該類型的值作為BLOCK的第一個參數(shù)傳遞诵闭,以免返回undef。

$foo = reduce { $a + $b } 0, @values;             # sum with 0 identity value

any

my $bool = any { BLOCK } @list;

如果列表中的元素澎嚣,有任何一個能使BLOCK返回true疏尿,則返回true;只有當(dāng)列表中的所有元素都使用BLOCK返回false時才返回false易桃。

if( any { length > 10 } @strings ) {
    # at least one string has more than 10 characters
}

all

my $bool = all { BLOCK } @list;

只有列表中的所有元素都使BLOCK返回true時褥琐,才返回true。如果列表中有任何一個元素使得BLOCK返回false晤郑,則返回false敌呈。

none & notall

my $bool = none { BLOCK } @list;

my $bool = notall { BLOCK } @list;

對于none函數(shù),只有列表中的所有函數(shù)都使BLOCK返回false時才返回true造寝;如果列表中有一個元素使得BLOCK返回true磕洪,則返回false。
對于notall函數(shù)诫龙,如果列表中有一個元素使得BLOCK返回false則返回true析显。只有列表中所有元素都使得BLOCK返回true時才返回false。

first

my $val = first { BLOCK } @list;

返回列表中第一個能夠使得BLOCK返回true的元素签赃。

$foo = first { defined($_) } @list    # first defined value in @list
$foo = first { $_ > $value } @list    # first value in @list which
                                      # is greater than $value

max

my $num = max @list;

返回列表中數(shù)值最大的元素谷异。如果列表為空則返回undef。

$foo = max 1..10                # 10
$foo = max 3,9,12               # 12
$foo = max @bar, @baz           # whatever

maxstr

my $str = maxstr @list;

類似于 max 函數(shù)姊舵,把列表中的所有值視為字符串晰绎,返回列表中以字符串方式比較得到的最大的元素。

$foo = maxstr 'A'..'Z'          # 'Z'
$foo = maxstr "hello","world"   # "world"
$foo = maxstr @bar, @baz        # whatever

min

my $num = min @list;

返回列表中的數(shù)值最小的元素括丁。如果列表為空則返回undef。

$foo = min 1..10                # 1
$foo = min 3,9,12               # 3
$foo = min @bar, @baz           # whatever

minstr

my $str = minstr @list;

類似于 min 函數(shù)伶选,把列表中的所有值視為字符串史飞,返回列表中以字符串方式比較得到的最小的元素。

$foo = minstr 'A'..'Z'          # 'A'
$foo = minstr "hello","world"   # "hello"
$foo = minstr @bar, @baz        # whatever

product

my $num = product @list;

返回列表中所有元素數(shù)值乘積仰税。如果@list為空則返回1构资。

$foo = product 1..10            # 3628800
$foo = product 3,9,12           # 324

sum

my $num_or_undef = sum @list;

返回列表中所有元素的數(shù)值和,如果列表為空則返回undef陨簇。

$foo = sum 1..10                # 55
$foo = sum 3,9,12               # 24
$foo = sum @bar, @baz           # whatever

sum0

my $num = sum0 @list;

在功能上與 sum 相同吐绵,唯一的區(qū)別是當(dāng)參數(shù)是一個空列表時,返回的不是nudef而是 0.

從列表到鍵值對的映射函數(shù)

pairs

my @pairs = pairs @kvlist;

參數(shù)為一個偶數(shù)個元素的列表@kvlist,返回一個數(shù)組引用的列表己单,每個數(shù)組引用中包含@kvlist兩個元素唉窃。此函數(shù)與下面的代碼返回的結(jié)果是一樣的。

@pairs = pairmap { [ $a, $b ] } @kvlist

在for循環(huán)中使用些方法的例子如下:

foreach my $pair ( pairs @kvlist ) {
   my ( $key, $value ) = @$pair;
   ...
}

自 1.39 版本以后纹笼,這些ARRAY引用都是被祝福過的對象纹份,可以使用類似下面的方法獲取key和value。

foreach my $pair ( pairs @kvlist ) {
   my $key   = $pair->key;
   my $value = $pair->value;
   ...
}

unpairs

my @kvlist = unpairs @pairs

這個函數(shù)是pairs的逆函數(shù)廷痘,此函數(shù)將以ARRAY引用(每個ARRAY引用中只有兩個元素)為元素的列表處理成一個平坦化的列表蔓涧。在意思上相當(dāng)于以下代碼的功能:

my @kvlist = map { @{$_}[0,1] } @pairs

對于參數(shù)列表中的每個ARRAY引用它都會提取兩個值放到返回列表中。如果作為元素的ARRAY引用中有多余兩個的元素笋额,則后面的元素會被忽略元暴;如果少于兩個元素,則會使用undef代替兄猩。

下面的代碼是一種應(yīng)用場景茉盏,用于對鍵值對進(jìn)行排序。

@kvlist = unpairs sort { $a->key cmp $b->key } pairs @kvlist

pairkeys

my @keys = pairkeys @kvlist;

返回給定列表所映射到的每個“鍵值對”中鍵的列表厦滤。與下面的代碼是等效的:

@keys = pairmap { $a } @kvlist

pairvalues

my @values = pairvalues @kvlist;

返回給定列表所映射到的每個“鍵值對”中值的列表援岩。與下面的代碼是等效的:

@values = pairmap { $b } @kvlist

pairgrep

my @kvlist = pairgrep { BLOCK } @kvlist;
my $count = pairgrep { BLOCK } @kvlist;

與perl的grep關(guān)鍵字類似,但將給定列表解釋為“鍵值對”的列表掏导。然后在標(biāo)量上下文件中調(diào)用BLOCK享怀,參數(shù)$a和$b是“鍵值對”列表中一個元素的“鍵”和“值”,也就是@kvlist列表中連續(xù)的兩個元素趟咆。返回一個列表添瓷,列表中的元素是所有使得BLOCK返回true的“鍵值對”(不是ARRAY的引用哦,是以兩個值作為兩個元素存在于列表中)值纱。在標(biāo)量上下文件中返回的是結(jié)果列表中的“鍵值對”的數(shù)量鳞贷,是元素數(shù)量的一半。

@subset = pairgrep { $a =~ m/^[[:upper:]]+$/ } @kvlist

pairfirst

my ( $key, $val ) = pairfirst { BLOCK } @kvlist;

my $found = pairfirst { BLOCK } @kvlist;

類似于 first 函數(shù)的功能虐唠,但將給定列表解釋為“鍵值對”的列表搀愧。然后在標(biāo)量上下文件中調(diào)用BLOCK,參數(shù)$a和$b是“鍵值對”列表中一個元素的“鍵”和“值”疆偿,也就是@kvlist列表中連續(xù)的兩個元素咱筛。返回一個僅包含兩個元素的列表,這兩個元素就是第一個使得BLOCK返回true的“鍵值對”的鍵和值杆故。如果所有“鍵值對”都無法使用得BLOCK返回true迅箩,則返回一個空列表。在標(biāo)量上下文件中返回一個簡單的布爾值处铛,而不是“鍵值對”或找到的值饲趋。

( $key, $value ) = pairfirst { $a =~ m/^[[:upper:]]+$/ } @kvlist

pairmap

my @list = pairmap { BLOCK } @kvlist;

my $count = pairmap { BLOCK } @kvlist;

與perl的grep關(guān)鍵字類似拐揭,但將給定列表解釋為“鍵值對”的列表。然后在標(biāo)量上下文件中調(diào)用BLOCK奕塑,參數(shù)$a和$b是“鍵值對”列表中一個元素的“鍵”和“值”堂污,也就是@kvlist列表中連續(xù)的兩個元素。返回一個列表爵川,列表中的元素是每次調(diào)用BLOCK得到的返回值組成的列表敷鸦。在標(biāo)量上下文件中返回的是結(jié)果列表的長度。

其他函數(shù)

shuffle

my @values = shuffle @values;

以隨機的順序?qū)斎氲脑剡M(jìn)行排列并返回寝贡。

@cards = shuffle 0..51      # 0..51 in a random order

uniq

my @subset = uniq @values

返回一個不包含任何重復(fù)元素的列表扒披。對原列表進(jìn)行處理,確保在前面已經(jīng)出現(xiàn)的元素不會在后面的處理中被加入到返回的列表中圃泡。

my $count = uniq @values

在標(biāo)題上下文件返回結(jié)果列表的長度碟案。

注:此函數(shù)認(rèn)為 undef與空字符串是不同的,并且不會產(chǎn)生警告颇蜡。它在返回的列表中按原樣保留价说。后續(xù)undef值仍然被認(rèn)為與第一個值相同,并將被刪除风秤。

uniqnum

my @subset = uniqnum @values

把參數(shù)列表中的所有元素都當(dāng)成數(shù)字處理鳖目,返回一個不包含任何重復(fù)元素的列表。對原列表進(jìn)行處理缤弦,確保在前面已經(jīng)出現(xiàn)的元素不會在后面的處理中被加入到返回的列表中领迈。

my $count = uniqnum @values

在標(biāo)題上下文件返回結(jié)果列表的長度。

注:此函數(shù)把undef空成數(shù)字0對待碍沐。

uniqstr

my @subset = uniqstr @values

把參數(shù)列表中的所有元素都當(dāng)成字符串處理狸捅,返回一個不包含任何重復(fù)元素的列表。對原列表進(jìn)行處理累提,確保在前面已經(jīng)出現(xiàn)的元素不會在后面的處理中被加入到返回的列表中尘喝。

my $count = uniqstr @values

在標(biāo)題上下文件返回結(jié)果列表的長度。

注:此函數(shù)把undef空成空字符串對待斋陪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朽褪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子无虚,更是在濱河造成了極大的恐慌鞍匾,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骑科,死亡現(xiàn)場離奇詭異,居然都是意外死亡构拳,警方通過查閱死者的電腦和手機咆爽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門梁棠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斗埂,你說我怎么就攤上這事符糊。” “怎么了呛凶?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵男娄,是天一觀的道長。 經(jīng)常有香客問我漾稀,道長模闲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任崭捍,我火速辦了婚禮尸折,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘殷蛇。我一直安慰自己实夹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布粒梦。 她就那樣靜靜地躺著亮航,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匀们。 梳的紋絲不亂的頭發(fā)上缴淋,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音昼蛀,去河邊找鬼宴猾。 笑死,一個胖子當(dāng)著我的面吹牛叼旋,可吹牛的內(nèi)容都是我干的仇哆。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼夫植,長吁一口氣:“原來是場噩夢啊……” “哼讹剔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起详民,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤延欠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沈跨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體由捎,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年饿凛,在試婚紗的時候發(fā)現(xiàn)自己被綠了狞玛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片软驰。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖心肪,靈堂內(nèi)的尸體忽然破棺而出锭亏,到底是詐尸還是另有隱情,我是刑警寧澤硬鞍,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布慧瘤,位于F島的核電站,受9級特大地震影響固该,放射性物質(zhì)發(fā)生泄漏锅减。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一蹬音、第九天 我趴在偏房一處隱蔽的房頂上張望上煤。 院中可真熱鬧,春花似錦著淆、人聲如沸劫狠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽独泞。三九已至,卻和暖如春苔埋,著一層夾襖步出監(jiān)牢的瞬間懦砂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工组橄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荞膘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓玉工,卻偏偏與公主長得像羽资,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遵班,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 從匹配中返回值 Match 對象 成功的匹配總是返回一個 Match 對象, 這個對象通常也被放進(jìn) $/ 中, (...
    焉知非魚閱讀 1,792評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理屠升,服務(wù)發(fā)現(xiàn),斷路器狭郑,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,635評論 0 7
  • 猶記同桌恰少年腹暖,蘇仙嶺下飲清泉。 獨歡瀚墨心中醉翰萨,不念花枝眼里妍脏答。 信步紅塵輕勝馬,樂觀風(fēng)雨淡如煙。 浮云莫笑青松...
    大智勿小聰閱讀 1,686評論 2 25
  • 今天中午利用午休時間步行去了海邊以蕴,走了近七公里糙麦。 海邊小路很美,海邊的一片樹及樹下的草和花也很美丛肮。 大海在暖陽的照...
    孫德娟欣欣兒閱讀 286評論 0 1