1. ホーム
  2. スクリプト・コラム
  3. パール

Perl List::Util モジュールの使用例

2022-01-16 06:39:17

Perl にはリストデータを扱うための専用モジュールがいくつかあります。例えば List::Util モジュールは標準ライブラリに含まれ、一般的なリスト処理のためのさまざまな効率的なツールを提供します。これはCで実装されているため、一般にかなり高速です!

[例01] ある条件にマッチするリストをスキャンし、最初にマッチするものを取得する。
ルーチンです。

コピーコード コードは以下の通りです。

use 5.010; 
my @names = qw(Wendy Jerry Betty Wendy Alice); 
foreach (@names) { 
    if (/\bWendy\b/i) { 
        $match = $_; 
        last; 
    } 

say $match;     

代わりに List::Util モジュールが提供する最初のサブルーチンを使用する方がはるかに簡単です。
コピーコード コードは以下の通りです。

use List::Util qw(first); 
my $match = first {/\bWendy\b/i} @names; #Find the first Wendy that terminates 
If you switch to numbers, for example, ask for

[例題02】 1と1000の間の和を求めよ
定期的に練習する。
コピーコード コードは以下の通りです。

use 5.010; 
my $total = 0; 
foreach (1..1000) { 
    $total += $_; 

say $total; #result 500500 

代わりにList::Utilモジュールが提供するsumサブルーチンを使用するのも簡単でしょう。
コピーコード コードは以下の通りです。

use List::Util qw(sum); 
my $total = sum(1..1000); #result 500500 

[例題03】 数値の集合の最大値、最小値を求めよ。
従来の方法:
コピーコード コードは以下の通りです。

#! /usr/bin/perl;   
use utf8;   
sub max {   
   my($max_so_far) = shift @_; # The first value in the array, taken as the maximum for now.   
   foreach(@_){ # Iterate through the array @_   
   if($_>$max_so_far){ # See if any other element has a value larger than $max_so_far.   
    $max_so_far = $_;} #Update the max_so_far variable if there is   
   }   
   $max_so_far;   
}   
my $_MaxData = &max(2,3,8,5,10);   
print $_MaxData; #result is 10 

代わりに List::Util モジュールが提供する max サブルーチンを使用すれば、非常に簡単です。
コピーコード コードは以下の通りです。

use List::Util qw(max); 
my $max = max(2, 3, 8, 5, 10); 
print $max; #result is 10 

同じ意味で、List::Utilモジュールが提供するminサブルーチンを使って、最小値を求めます。
コピーコード コードは以下の通りです。

use List::Util qw(min); 
my $min = min(2, 3, 8, 5, 10); #minimum value is 2 

[例題04】文字列の集合を並べ替える
通常の方法では、1つずつ順番に比較しなければなりませんが、これはList::Utilのサブルーチンであるmaxstrを使えば簡単にできます。
コピーコード コードは以下の通りです。

use List::Util qw(maxstr); 
my $max_str = maxstr( qw/Jerry Betty Alice Fred Barney jerry/ ); 
print $max_str; 

[例05] リストの要素をランダムに並べ替える
通常の方法では難しいのですが、List::Utilのshuffleサブルーチンを使えば、コマンド一つでとても簡単に実現することができます!
コピーコード コードは以下の通りです。

use List::Util qw(shuffle); 
my @shuffled_nums = shuffle(1..10); # 3 9 8 5 6 4 1 10 2 7                 
my @shuffled_name = shuffle('A'...' G');# F E G A B D  

[例06】 リストに要素がないか、要素があるか、すべての要素が条件に合うかをチェックします。grepのような構文をサポート
これは通常のメソッドでは難しいですが、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";} 
NOTE: List::MoreUtils is not a self-contained module and needs to be downloaded.

[例07】複数の名簿を同時に処理し、2桁ずつ取り出す場合
コピーコード コードは以下の通りです。

use List::MoreUtils qw(natatime);  
my @names_1 = qw(Alice Bob Carly); 
my @names_2 = qw(David Edward Foo); 
my $names = natatime(2, @names_1, @names_2); #natatim (N at a time: process N groups at the same time) if you have more than one list, just put it inside 
while (my @name = $names->()) { #traversal, for later output 
    print "Got @name\n"; 

# Output results 
Got Alice Bob 
Got Carly David 
Got Edward Foo 

[例08】複数のリストを1つのリストに統合する

コピーコード コードは以下の通りです。

use List::MoreUtils qw(mesh); 
my @array_1 = 'A' ... 'D'; 
my @array_2 = 1 ... 4; 
my @array_3 = qw( jerry alice wendy ); 
my @array_new = mesh(@array_1, @array_2, @array_3); 
print @array_new; 
# Output results: 
A=>1=>jerry=> B=>2=>alice=> C=>3=>wendy=> D=>4

1番目:1番目のリストからAを、2番目のリストから1を、3番目のリストからjerryを取る
2番目:1番目のリストからB、2番目のリストから2、3番目のリストからaliceを取る
......
この順番で!?
[例09】 指定した文字列に文字を追加する
List::MoreUtils の insert_after サブルーチンを使用することができます。

コピーコード コードは以下の通りです。

use v5.10; 
use List::MoreUtils qw(:all); 
my @list = qw/This is a list/; 
insert_after {$_ eq 'a'} "longer" => @list; 
print @list; #This is a longer list

[例10】 2つのリストに対して演算を行う。1つ目のリストを2乗した後、2つ目のリストを合計します。
List::MoreUtils の pairwise サブルーチンを使用することができます。
コピーコード コードは以下の通りです。

use v5.10; 
use List::MoreUtils qw(:all); 
@m = (1..4); 
@n = (100..103); 
@x = pairwise { ($a*$a) + $b } @m, @n; #101 105 111 119 

[概要】をご覧ください。]
上記を普通に実装すると、ループを何度も繰り返す必要があり、非常に面倒ですが、複雑なアルゴリズム、データ構造をC言語で実装し、Listモジュールにカプセル化することで、一見複雑に見える多くの機能を実現できます。このことからも、多数のモジュールでサポートされているCPANにPerlの力があることが分かりますね!