文字列の分割
■この章で解説する組み込み関数
split, map
■この章でできること
・文字列を任意のパターンで分割する
・配列の各要素を分割する
・配列の各要素を変換する

 文字列を分割するには、split関数を使います。例えばカンマ区切りになっている文字列データを個々のデータに分割したい場合などに使います。また、英文をスペースで分割すれば、単語単位の配列にすることができます。では、サンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# 文字列の分割のサンプル1
# produced by "Perl Programming Tips"
#############################################

$string1 = "abc,def,ghi";

# 文字列の分割
@array2 = split(/,/, $string1);
print($_ . "\n") foreach (@array2);
print("\n");

# 分割数を指定
@array2 = split(/,/, $string1, 2);
print($_ . "\n") foreach (@array2);
print("\n");

# 分割するパターンも結果に含む
@array2 = split(/(,)/, $string1);
print($_ . "\n") foreach (@array2);
print("\n");

# 複数の分割文字を指定
@array2 = split(/[,e]/, $string1);
print($_ . "\n") foreach (@array2);

 実行結果は次のようになります。

[g@630m pl]$ perl regular01_01.pl
abc
def
ghi

abc
def,ghi

abc
,
def
,
ghi

abc
d
f
ghi
[g@630m pl]$

 まず、split関数の使い方ですが、第一引数に分割する条件を正規表現で指定します。第三引数には分割する数を指定します。省略した場合は、パターンにマッチする限り最後まで無制限に分割されます。結果はリストで返されます。

split
指定した分割パターンで文字列を分割する。
書式
split /pattern/, string, [limit]
引数
pattern:
正規表現であらわした分割パターン
string:
分割する文字列
limit:
分割する最大個数
戻り値
分割したリスト

 上のサンプルの場合、カンマで分割しています。分割数を指定した場合はその数しか分割されていないのが分かります。

 また、デフォルトでは分割するパターン文字(上の例ではカンマ)は切り捨てられますが、分割するパターン文字も結果に含めたい場合は、パターンを括弧で囲みます。複数のパターンで分割したい場合は、パターン文字を[]で囲み、文字クラスにします。

 次に、配列の各要素に対してフィルタをかけられるmap関数の使い方を解説します。これを使うと、配列の各要素を一度に分割することができます。まずはサンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# 文字列の分割のサンプル2
# produced by "Perl Programming Tips"
#############################################

@array1 = ("aaa,bbb,ccc", "ddd,eee,fff");

# 配列の各要素を分割
@array2 = map({split(/,/)} @array1);
print($_ . "\n") foreach (@array2);
print("\n");

# 配列の各要素を変換
@array2 = map(uc, @array1);
print($_ . "\n") foreach (@array2);

 実行結果は次のようになります。

[g@630m pl]$ perl regular01_02.pl
aaa
bbb
ccc
ddd
eee
fff

AAA,BBB,CCC
DDD,EEE,FFF
[g@630m pl]$

 map関数の第一引数には、ブロックや関数を指定します。map関数は、配列の要素を一つずつ取り出して(一時的に$_に設定し)、ブロックを評価します。評価結果はリストコンテキストです。これを全要素分繰り返します。map関数の戻り値は1つのリストなので、各要素の評価結果を1つの平らなリストに結合したものになります。

map
指定したブロックまたは関数で配列の各要素を評価し、1つの配列にして返す。
書式
map {block} list
map expr, list
引数
block:
評価ブロック
expr:
評価関数
list:
評価対象の配列
戻り値
評価済み配列

 配列の各要素を分割して、1つの配列にしたい場合は、上のサンプルのように評価ブロック内でsplit関数で分割すればできます。