Perl入門 ≫ LESSON13 リスト関数

リスト関数の基本

Perlでは、配列・ハッシュに関する色々な関数が用意されています。

●each:キーと値のセットを取り出す

each ハッシュ

ハッシュのキーと値のそれぞれのセットを返します。

my %v = ('t1'=>'data1','t2'=>'data2','t3'=>'data3');

while((my $key,my $value) = each %v) {
    print "KEY:$key VALUE:$value\n";
}

結果

KEY:t1 VALUE:data1
KEY:t2 VALUE:data2
KEY:t3 VALUE:data3

実はハッシュは順番は保存されないのです。定義した順で表示されるとは限りません。下で説明する並べ替える関数などを使って並べ替えましょう。

●keys:キー取り出し

keys ハッシュ

指定したハッシュの全てのキーをリストで返します。スカラーコンテキストでは、ハッシュの要素数を返します。

my %v = ('t1'=>'data1','t2'=>'data2', 't3'=>'data3');

#ハッシュの要素数
my $k = keys %v;
print "count $k\n";

foreach(keys %v) {
    #キーを出力
    print "KEY $_\n";
}

結果

count 3
KEY t1
KEY t2
KEY t3


●values:値取り出し

values ハッシュ

指定したハッシュの全ての値をリストで返します。

my %v = ('t1'=>'data1', 't2'=>'data2', 't3'=>'data3', 't3_1'=>'data3');

my @k = values %v;
foreach(@k) {
    #値を出力
    print "VALUE $_\n";
}

結果

VALUE data1
VALUE data2
VALUE data3
VALUE data3


●grep:評価が真のリストを返す

grep 評価文,リスト

リストの全要素について評価文を評価し、結果が真のものをリストにして返します。 スカラーのコンテキストでは結果が真になった回数を返します。

my @v = ('aaa','bbb','abc','abb','bcc');

#最初の文字がaで始まるリストを評価。
#評価の部分に関しては後の正規表現を参照のこと。)

my @k = grep(/^a/, @v);
#評価された回数を取る
my $k = grep(/^a/, @v);

print "count:$k (@k)";

結果

count:3 (aaa abc abb)


●map

map 評価文,リスト

リストの全要素について評価文を評価し、その際特殊変数$_を各要素のローカルな別名として設定し、評価結果のリストを返します。

my @v = ('aaa','bbb','abc','abb','bcc');

#最初の文字がaで始まるリストを評価。
my @k = map(/^a/, @v);
#評価された回数を取る
my $k = map(/^a/, @v);

print "count:$k (@k)";

結果

count:3 (1 1 1)


●join:文字列連結

join 文字列,リスト

リストの全要素を指定した文字列で連結した文字列を返します。

my @v = ('aaa','bbb','ccc');

#リストの全要素を'!='で連結。
my $k = join('!=', @v);

print "$k";

結果

aaa!=bbb!=ccc


●split:文字列分割

split [パターン [, 文字列 [,分割数]]]

文字列をパターンで区切られる文字列のリストに分割してそれを返します。 分割数が正の場合は最大でそのフィールド数まで分割します。
分割数を省略すると0とみなされ、最後の空フィールドは返しません。
パターンを省略すると空白で分割します。(先頭の空白はスキップする)

#文字列'aa'で分割する
my @k = split(/aa/, " aiuaaaaeoplaapl e");

for(my $i = 0; $i <= $#k; $i++) {
    print "$i : '$k[$i]'\n";
}

結果

0 : ' aiu'
1 : ''
2 : 'eopl'
3 : 'pl e'


#文字列'aa'で3分割する
my @k = split(/aa/, " aiuaaaaeoplaapl e",3);

for(my $i = 0; $i <= $#k; $i++) {
    print "$i : '$k[$i]'\n";
}

結果

0 : ' aiu'
1 : ''
2 : 'eoplaapl e'


#空白で分割
$_ = " aiuaaa aeoplaapl e"
my @k = split;

for(my $i = 0; $i <= $#k; $i++) {
    print "$i : '$k[$i]'\n";
}

結果

0 : 'aiuaaa'←最初の空白はスキップ
1 : 'aeoplaapl'
2 : 'e'


●splice

splice 配列, オフセット [, 長さ [, リスト]]

配列のオフセットから長さ分の要素を削除し、リストが指定されていればそれによって置き換えます。
削除した要素のリストを返します。オフセットが負の場合には、配列の末尾から数えます。

my @v = ('aaa','bbb','ccc','ddd','eee');
#添え字3の要素から削除
my @k = splice(@v, 3);

#削除したリスト
for(my $i = 0; $i <= $#k; $i++) {
    print "$i : '$k[$i]'\n";
}
print "\n";
#残ったリスト
for(my $i = 0; $i <= $#v; $i++) {
    print "$i : '$v[$i]'\n";
}

結果

0 : 'ddd'
1 : 'eee'

0 : 'aaa'
1 : 'bbb'
2 : 'ccc'


my @v = ('aaa','bbb','ccc','ddd','eee');
my @v1 = ('xxx','yyy','zzz');
#添え字3から4の要素を削除し置き換える
my @k = splice(@v, 2, 2, @v1);

#削除したリスト
for(my $i = 0; $i <= $#k; $i++) {
    print "$i : '$k[$i]'\n";
}
print "\n";
#残ったリスト
for(my $i = 0; $i <= $#v; $i++) {
    print "$i : '$v[$i]'\n";
}

結果

0 : 'ccc'
1 : 'ddd'

0 : 'aaa'
1 : 'bbb'
2 : 'xxx'
3 : 'yyy'
4 : 'zzz'
5 : 'eee'


●pop:配列最後の要素取り出し

pop [配列]

配列の最後の要素を取り出して、その要素を返します。(配列から最後の要素はなくなります)
配列を指定しなければ特殊変数@_からpopします。

my @v = ('aaa','bbb','ccc');

#配列の最後の要素を取り出す。
my $k = pop @v;

#取り出した要素と残った配列を出力
print "$k : \@v = (@v)";

結果

ccc : @v = (aaa bbb)


●push:配列追加

push 配列,リスト

配列にリストの要素を追加して、結果としてできた配列の長さを返します。

my @v = ('aaa','bbb','ccc');

#要素'ddd'を追加する
my $k = push(@v, 'ddd');
print "$k : @v\n";

#配列を倍にする
$k = push(@v, @v);
print "$k : @v";

結果

4 : aaa bbb ccc ddd
8 : aaa bbb ccc ddd aaa bbb ccc ddd


●shift:配列先頭要素取り出し

shift [配列]

配列の先頭要素を取り除いて、その要素を返します。(リストから最初の要素はなくなり、要素は一つづつ前にずれる。)
リストを指定しなければ特殊変数@_からshiftします。

my @v = ('aaa','bbb','ccc');

#配列の最初の要素を取り出す。
my $k = shift @v;

#取り出した要素と残った配列を出力
print "$k : $v[0] $v[1]";

結果

aaa : bbb ccc


●unshift:先頭に要素追加

unshift 配列,リスト

配列の先頭にリストの要素を追加して、結果としてできた配列の長さを返します。

my @v = ('aaa','bbb','ccc');

#要素'ddd'を先頭に追加する
my $k = unshift(@v, 'ddd');
print "$k : @v\n";

my @v2 = ('yyy','zzz');
$k = unshift(@v, @v2);
print "$k : @v";

結果

4 : ddd aaa bbb ccc
6 : yyy zzz ddd aaa bbb ccc


●reverse:逆配列

reverse リスト

リストを逆順にした結果を返します。スカラーの場合はバイト単位で並べ替えた結果を返します。

my @v = ('aaa','bbb','ccc');

#リストを逆にする
my @k = reverse(@v);
print "@k\n";

#スカラーを逆にする
my $k = reverse "test";
print "$k";

結果

ccc bbb aaa
tset


●sort:ソート

sort [サブルーチン] リスト

リストをソートしてその結果を返します。比較関数としてサブルーチンを使用することもできます。
その関数は要素を比較した結果によって、0よりも小さい、0、0よりも大きいのいずれかの値を返します。 (このためのサブルーチンにおいては、 <=>: や cmp といった演算子が大変便利です。)
サブルーチンの代わりにブロックで記述することもできます。

my @v = ('aaa','bbb','ccc','ab','cdf');
#辞書順でソート
my @k = sort @v;
print "@k\n";

#同様のものでソートルーチンを明示したもの
@k = sort {$a cmp $b;} @v;
print "@k\n";

#同様のもので逆順
@k = sort {$b cmp $a;} @v;
print "@k\n";

@v = (1,30,2,5,11,4,2,4,15);
#辞書順でソート
@k = sort @v;
print "@k\n";
#数値的に昇順にソート
@k = sort {$a <=> $b;} @v;
print "@k\n";

#数値的に降順にソート
@k = sort {$b <=> $a;} @v;
print "@k\n";

#明示的なサブルーチン名でソート
sub sort1 {
    $a <=> $b;
}
@k = sort sort1 @v; print "@k";

結果

aaa ab bbb ccc cdf
aaa ab bbb ccc cdf
cdf ccc bbb ab aaa
1 11 15 2 2 30 4 4 5 ←辞書順だとこうなってしまう
1 2 2 4 4 5 11 15 30
30 15 11 5 4 4 2 2 1
1 2 2 4 4 5 11 15 30


●scalar

scalar 配列

配列の要素数を返します。

my @v = ('aaa', 'bbb');

my $k = scalar @v;
print "\@v : $k\n";

my @v1 = ();
$k = scalar @v1;
print "\@v1 : $k"

結果

@v : 2
@v1 : 0


●scalar

scalar ハッシュ

ハッシュにキーが存在すれば真を返します。

my %v = ('t1'=>'data1',
't2'=>'data2',
't3'=>'data3');

if(scalar %v) {
    print "KEY exists\n";
} else {
    print "KEY not exists\n";
}

結果

KEY exists


●delete

delete ハッシュ

ハッシュの要素を削除して、削除した要素を返します。

my %v = ('t1'=>'data1',
't2'=>'data2',
't3'=>'data3',
't4'=>'data4');

my $k = delete $v{'t2'};
my @v = keys %v;
print "delete : '$k'\nKEYS : @v";

結果

delete : 'data2'
KEYS : t4 t1 t3


●exists

exists ハッシュ

ハッシュの要素が存在するかどうか調べます。

my %v = ('t1'=>'data1',
't2'=>'data2',
't3'=>'data3');

if(exists $v{'t2'}) {
    print "KEY 't2' exists\n";
} else {
    print "KEY 't2' not exists\n";
}

結果

KEY 't2' exists



ページのトップへ戻る