Perl 核心模組 List::Util(C 實作、極快)與擴充模組 List::MoreUtils 提供了豐富的列表處理函式,能以單行語句替代複雜迴圈。本文系統整理 10 大實用函式,含首次匹配、求和、極值、字串極值、隨機打亂、條件檢查、分批處理、交織合併、插入元素、成對運算**,並對比傳統寫法展示簡潔度提升。
use List::Util qw(first);
my @names = qw(Wendy Jerry Betty Wendy Alice);
my $match = first { /\bWendy\b/i } @names; # 找到第一個即停止
print $match; # Wendy
傳統寫法需 foreach + last,first 內建短路求值。
use List::Util qw(sum);
my $total = sum(1..1000); # 500500
C 層迴圈,比 Perl 迴圈快數倍。
use List::Util qw(max min);
my $max = max(2, 3, 8, 5, 10); # 10
my $min = min(2, 3, 8, 5, 10); # 2
use List::Util qw(maxstr);
my $max_str = maxstr(qw/Jerrry Betty Alice Fred Barney jerry/); # jerry
use List::Util qw(shuffle);
my @shuffled_nums = shuffle(1..10); # 3 9 8 5 6 4 1 10 2 7
my @shuffled_char = shuffle('A'..'G'); # F E G A B D C
Fisher-Yates 演算法,均勻分布。
cpanm List::MoreUtils)
use List::MoreUtils qw(none any all);
my @numbers = qw(7 4 1 3 78);
if (none { $_ > 100 } @numbers) { print "No elements over 100\n"; }
elsif (any { $_ > 50 } @numbers) { print "Some elements over 50\n"; }
elsif (all { $_ < 10 } @numbers) { print "All elements < 10\n"; }
語意清晰,避免手寫旗標變數迴圈。
use List::MoreUtils qw(natatime);
my @names1 = qw(Alice Bob Carly);
my @names2 = qw(David Edward Foo);
my $iter = natatime(2, @names1, @names2); # 每次取 2 個
while (my @batch = $iter->()) {
print "Got @batch\n";
}
# Got Alice Bob
# Got Carly David
# Got Edward Foo
支援多列表串接,自動扁平化後分批。
use List::MoreUtils qw(mesh);
my @a = 'A' .. 'D';
my @b = 1 .. 4;
my @c = qw(jerry alice wendy);
my @merged = mesh(@a, @b, @c);
# A 1 jerry B 2 alice C 3 wendy D 4
按索引輪流取各列表元素,短列表用 undef 補齊。
use List::MoreUtils qw(insert_after);
my @list = qw/This is a list/;
insert_after { $_ eq 'a' } "longer" => @list;
print "@list"; # This is a longer list
原地修改列表,區塊回傳真值時在該元素後插入。
use List::MoreUtils qw(pairwise);
my @m = 1..4;
my @n = 100..103;
my @x = pairwise { ($a * $a) + $b } @m, @n;
# 1*1+100=101, 2*2+101=105, 3*3+102=111, 4*4+103=119
print "@x"; # 101 105 111 119
$a、$b 分別為兩列表對應元素,支援任意運算。
| 函式 | 模組 | 時間複雜度 | 適用場景 |
|---|---|---|---|
| first | List::Util | O(k) k=首個匹配位置 | 尋找首個符合條件元素 |
| sum | List::Util | O(n) | 數值加總 |
| max/min | List::Util | O(n) | 極值查找 |
| shuffle | List::Util | O(n) | 隨機排列 |
| none/any/all | List::MoreUtils | O(n) 短路 | 條件量化 |
| natatime | List::MoreUtils | O(n) | 分批處理 |
| mesh | List::MoreUtils | O(n) | 多列表交織 |
| pairwise | List::MoreUtils | O(n) | 成對運算 |
# List::Util 為核心模組,Perl 5.8+ 內建
# List::MoreUtils 需安裝
cpanm List::MoreUtils
# 或
cpan List::MoreUtils
# 匯入建議:按需匯入,避免汙染命名空間
use List::Util qw(first sum max min shuffle);
use List::MoreUtils qw(none any all natatime mesh pairwise);
掌握 List::Util 與 List::MoreUtils,能將 Perl 列表處理從「手寫迴圈」升級為「宣告式單行語句」。這不僅提升程式碼簡潔度,更因 C 層實作獲得顯著效能優勢。建議將常用函式匯入專案共用模組,形成團隊慣用語。