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の力があることが分かりますね!
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ディレクトリ内のファイルを再帰的に走査するためのPerlスクリプト
-
ファイル操作に関するPerl学習メモ
-
Perl関数(サブルーチン)学習ノート
-
Perlによるファイル操作の例
-
Perl モジュールをパッケージ化し、外部依存性を追加する
-
Javaプログラマのための10分でわかるPerlチュートリアル
-
[解決済み] Perlで環境変数を設定するには?
-
[解決済み] Perlで整数の除算はどのようにすればよいのですか?
-
[解決済み] Perlスクリプトにコンパイルエラーがないことを確認する方法は?
-
問題発生 ----DBI ODBCエラー Perlスクリプトを実行中、エラー:[unixODBC][Driver Manager] データソース名が見つからない、およびデフォルトがない