
Perlのsplit関数とは?基本から応用までsplit関数の使い方を解説
Perlで配列を扱う際、よく使用する演算子としてsplitがあります。
splitを使いこなせれば、ユーザーが入力した文字列から必要な値のみを格納したり、読み込みファイルの内容を整理してリスト化することが可能です。様々な分割パターンを指定し、試しながら理解を深めていきましょう。
目次
1.splitとは
Perlの演算子の1つです。
英語の”split(~を割く/割る/分割する)“の意味の通り、文字列を指定したパターンで区切って要素に分割することができます。ある一定のルールで区切られたデータであれば、splitを使うことで簡単に必要な値をリスト化することができます。
2.基本的な使い方
扱うデータが何の記号で区切られているのかを確認し、パターンとして指定します。多くの場合は正規表現を使用します。正規表現については下記をご参照ください。
関連記事2-1.split(/分割するパターン/, 対象文字列)
①カンマで区切られたデータを分割する場合
my $alphabet = "A,B,C,D,E"; my @array = split(/,/, $alphabet); print "\@array=[@array]\n"; print "\$array[0]=[$array[0]]\n";
実行結果:
@array=[A B C D E] $array[0]=[A]
②空白で区切られたデータを分割する場合
①で「/,/」と指定した箇所を、「/ /」と変更します。
my $alphabet = "A B C D E"; my @array = split(/ /, $alphabet); print "\@array=[@array]\n";
実行結果:
@array=[A B C D E]
③1文字ずつ取り出す場合
「//」と何も指定しないことで、1文字(1バイト)ずつ分割することができます。
my $alphabet = "ABCDE"; my @array = split(//, $alphabet); print "\@array=[@array]\n";
実行結果:
@array=[A B C D E]
2-2.split(/分割するパターン/, 対象文字列, 分割数)
3番目の引数を入れることで、最大分割数を指定することもできます。
my $str = "A, B, C, D, E"; # 3つに分割する my @array1 = split(/,\s/, $str, 3); print “\@array1=\n”; foreach (@array1) { print "$_\n"; } # 分割数制限なし my @array2 = split(/,\s/, $str); print “\@array2=\n”; foreach (@array2) { print "$_\n"; }
実行結果:
@array1= A B C, D, E @array2= A B C D E
分割数の指定を入れない場合、対象文字列の末尾の空フィールドは無視されますが、下記のように「-1」を指定すると、無視されません。
# スペースやタブなどの空白が混在する文字列 my $str = " A B C D E "; my @array1 = split(/\s/, $str); # 空白1文字で分割 末尾の空フィールドは無視 print "\@array1=[@array1]\n"; my @array2 = split(/\s/, $str, -1); # 空白1文字で分割 末尾が空でも格納する print "\@array2=[@array2]\n"; my @array3 = split (/\s+/, $str); # 1つ以上の空白で分割 末尾の空フィールドは無視 print "\@array3=[@array3]\n"; my @array4 = split (/\s+/, $str, -1); # 1つ以上の空白で分割 末尾が空でも格納する print "\@array4=[@array4]\n";
実行結果:
@array1=[ A B C D E] @array2=[ A B C D E ] @array3=[ A B C D E] @array4=[ A B C D E ]
文字列の先頭の空白を無視したい場合は、パターンを下記の通り「’ ‘」と指定します。
@array5 = split (' ', $str); print "\@array5=[@array5]\n";
実行結果:
@array5=[A B C D E]
2-3.split(/分割するパターン/)
パターンのみの指定も可能です。この場合、対象文字列は「$_」(デフォルト変数)とみなされます。
my $str = "A:78:99:80\nB:54:90:100\nC:85:88:67\n"; foreach (split(/\n/, $str)){ my ($name, $koku_score, $suu_score, $ei_score) = split(/:/); print "$name君の成績は、国語$koku_score点、数学$suu_score点、英語$ei_score点です。\n"; }
実行結果:
A君の成績は、国語78点、数学99点、英語80点です。 B君の成績は、国語54点、数学90点、英語100点です。 C君の成績は、国語85点、数学88点、英語67点です。
3.応用的な使い方
3-1.パターンを変数で指定する
パターンは下記のように変数で指定することも可能です。
my $str ="123/abc/456/def/789"; my $pattern = "\/"; my @array = split(/$pattern/, $str); print "\@array=[@array]\n";
実行結果:
@array10=[123 abc 456 def 789]
3-2.配列ではなく、変数に代入する
いままでは配列に代入していましたが、変数に代入した場合はどうなるのでしょうか。
my $str = "A B C D E"; my $count = split(/ /, $str); my @array = split(/ /, $str); print "\$count=[$count], \@array=[@array]\n";
実行結果:
$count=[5], @array=[A B C D E]
変数に代入した場合は、分割された要素数(=配列の数)が取得できます。
3-3.joinと組み合わせて区切り記号を変更する
splitとセットで覚えておきたいjoin関数(splitと反対の処理をします)と併せて使用し、区切り記号を変更することもできます。
my $str = "A-B-C-D-E-F-G-H-I-J"; print "join('*', split(/-/, \$str))=[", join ('*', split(/-/, $str)), "]\n";
実行結果:
join('*', split(/-/, $str))=[A*B*C*D*E*F*G*H*I*J]
4.まとめ
splitは文字列を分割して配列にする演算子でした。反対に配列の要素を結合して文字列にするjoinという組み込み関数もあります。両方つかいこなせると便利ですね。
コメント