Perlのすべてがここにある!

Perl split関数~基本から応用まで~

カヌレ子

開発エンジニア/Java/Perl/ボールド歴2年

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という組み込み関数もあります。両方つかいこなせると便利ですね。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

文系IT未経験歓迎!【23卒対象】新卒採用のエントリーを受付中!
文系IT未経験歓迎!
【23卒対象】新卒採用のエントリーを受付中!