Landscape トップページ | < 前の日 2004-11-13 2004-11-14 次の日 2004-11-15 >

Landscape - エンジニアのメモ 2004-11-14

List::Util Perl 標準の配列操作ライブラリ


* List::Util Perl 標準の配列操作ライブラリ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

List::Util は配列の最大値、最小値、合計値を取得したり、配列をシャッフルしたりするためのルーチンを集めたPerl モジュール。Perl 標準ではなかったが結構前からあったモジュールらしい。Perl 5.8 から標準ライブラリとして組み込まれたようだ。Scalar-List-Utils が元なのかな?

私ははっきり言って全く知らなかった。あると便利だけどこのくらいなら自分で書いちゃうし、Google で List::Util を検索してもあまりヒットしないしね。

日本語で読める文書は以下のサイトが一番詳しい。
Hash::Util - 便利な配列用関数のピックアップ
http://fleur.hio.jp/~hio/perldoc/mix/lib/List/Util.html

以下、よく使いそうなメソッドと実行結果のサンプル。ワンライナー (One Liner) だけど。

- 配列の要素のうちの最大値を取得

max LIST
$ perl -MList::Util -e  'print List::Util::max(0..9);'
9

- 配列の要素のうちの最小値を取得

min LIST
$ perl -MList::Util -e  'print List::Util::min(0..9);'
0

- 配列の要素の合計値を取得

sum LIST
$ perl -MList::Util -e  'print List::Util::sum(0..9);'
45

- 配列のシャッフル

shuffle LIST
$ perl -MList::Util -e  'print List::Util::shuffle(0..9);'
1697803452

- その他

あんまり使わなそうなものたち。

first BLOCK LIST
LIST の要素を順番に $_ に設定して BLOCK を評価する点で grep と似ています. first は BLOCK が真と評価した最初の要素を返します. BLOCK が一度も真を返さなかったり LIST が空だったときには undef を返します.

$foo = first { defined($_) } @list    # first defined value in @list
                                      # @list で最初に定義されている値.
$foo = first { $_ > $value } @list    # first value in @list which
                                      # is greater than $value
                                      # @list の中で $value より大きい
                                      # 最初の値.

maxstr LIST
max と似ていますが, 全ての要素は文字列として処理され, gt によって一番大きいと評価された文字列を返します

minstr LIST
min と似ていますが, 全ての要素は文字列として処理され, lt によって一番小さいと評価された文字列を返します.

reduce BLOCK LIST
最初に説明を読んだときは、これで何をしたいの? と思った。要するに foreach を使わずに、配列要素同士をいろいろ操作できるんだね。慣れると便利かも。
BLOCK を複数回呼び出して LIST を減少させます. 毎回 $a 及び $b が設定されます. 最初の呼び出しでは $a と $b にはリストの最初の2つの要素が設定されます. その後の呼び出しでは $a に1つ前の呼び出しでの復帰値が, $b にはリストの次の要素が設定されます.
最後の BLOCK の呼び出しの復帰値が返されます. もし LIST が空だったときには undef が返されます. LIST が1つしか値を持っていなかったときには BLOCK を実行することなしにその要素が返されます.

$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

- List::Util はメソッドをエクスポートしない

List::Util はメソッドをエクスポートしない。
By default List::Util does not export any subroutines.

つまり、use するときは明示的に使うメソッドを記述するか、名前空間付きでメソッドを記述する必要がある。
use List::Util qw(shuffle);

明示しないと以下のようになる。
$ perl -MList::Util -e  'print shuffle(0..9);'
Undefined subroutine &main::shuffle called at -e line 1.

エクスポートしない理由は不明。既存のライブラリとメソッド名が一緒になるから? それじゃあ何のために名前空間があるのかわからないし。

- Hash::Util

Hash::Util というものもあるが、ドキュメントを読むと以下のメソッドしか用意されてない。キーや値を追加できなくしたり、削除できなくしたりするらしい。あんまり使わないだろうなあ。get アクセサしか用意しないメンバを作りたいといった、オブジェクト指向的なアクセス制御に使ったりするのかな?
use Hash::Util qw(lock_keys  unlock_keys
                  lock_value  unlock_value
                  lock_hash  unlock_hash);


すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。