文字列の切り取り
■この章で解説する組み込み関数
chop, chomp, substr
■この章でできること
・行末の改行文字を削除する
・文字列の行末文字を削除する
・配列の行末の改行文字を一括削除する
・配列の文字列の行末文字を一括削除する
・文字列から部分文字列を取り出す
・文字列の一部を別の文字列に置き換える

 ここでは、文字列を切り取る方法を解説します。まず、Perlでは使用頻度の高い、行末文字の切り取りについてです。行末文字を切り取る関数は、chopとchompの2つがあります。

 chompは行末の改行文字を削除、chopは行末の任意の1文字を削除します。まずはサンプルソースを見てみましょう。

#!/usr/bin/perl

#############################################
# 文字列の切り取りのサンプル1
# Author: "Perl Programming Tips"
#############################################

$var1 = "abcde";
$var2 = "abcde\n";
$var3 = "abcde";
$var4 = "abcde\n";

print "Before:$var1 $var2 $var3 $var4";

# 行末文字(デフォルトは改行)を取り除く
chomp($var1);
chomp($var2);

# 最後の1文字を取り除く
chop($var3);
chop($var4);

print "After:$var1 $var2 $var3 $var4";

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

[g@630m pl]$ perl scalar01_01.pl
Before:abcde abcde
 abcde abcde
After:abcde abcde abcd abcde[g@630m pl]$

 chompでは行末が改行文字であった場合は削除、改行文字でなかった場合は何もしません。これに対して、chopでは改行文字かどうかにかかわらず、行末の1文字が削除されているのがわかります。

chomp
文字列またはリスト内の各文字列から行末の文字($/に設定されているもの)を削除する。
書式
chomp $var
引数
$var:
操作対象の文字列
戻り値
なし

chop
文字列またはリスト内の各文字列から最後の1文字を削除する。
書式
chop $var
引数
$var:
操作対象の文字列
戻り値
なし

 chompやchopはリストに対しても使用することができます。リストに対して使用すると、リスト内のそれぞれの文字列に対して行末文字の削除を行います。

#!/usr/bin/perl

#############################################
# 文字列の切り取りのサンプル2
# Author: "Perl Programming Tips"
#############################################

@var1 = ("abcd",   "efgh", "ijkl"  );
@var2 = ("abcd\n", "efgh", "ijkl\n");
@var3 = ("abcd",   "efgh", "ijkl"  );
@var4 = ("abcd\n", "efgh", "ijkl\n");

print "Before:{@var1} {@var2} {@var3} {@var4}";

# 行末文字(デフォルトは改行)を取り除く
chomp(@var1);
chomp(@var2);

# 最後の1文字を取り除く
chop(@var3);
chop(@var4);

print "After:{@var1} {@var2} {@var3} {@var4}";

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

[g@630m pl]$ perl scalar01_02.pl
Before:{abcd efgh ijkl} {abcd
 efgh ijkl
} {abcd efgh ijkl} {abcd
 efgh ijkl
}After:{abcd efgh ijkl} {abcd efgh ijkl} {abc efg ijk} {abcd efg ijkl}[g@630m pl]$

 リスト内の各メンバに対して一括で実行されているのが分かります。これは、テキスト形式のレコードファイルからデータを一括で読み込んだ後に、配列の行末の改行文字を一括で取り除く場合などに使うと便利です。

 次は、行末だけではなく、文字列内の任意の位置や長さを指定して部分文字列を取る方法です。これにはsubstr関数を使います。まずはサンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# 文字列の切り取りのサンプル3
# Author: "Perl Programming Tips"
#############################################

$string1 = "abcdefghijklmn\n";
$string2 = "abcdefghijklmn\n";
$string3 = "abcdefghijklmn\n";
$string4 = "abcdefghijklmn\n";

print "Before1:$string1";
print "Before2:$string2";
print "Before3:$string3";
print "Before4:$string4";

# 3文字目から末尾までを取り出す
print substr($string1, 3);

# 後ろから3文字目から末尾までを取り出す
print substr($string2, -3);

# 3文字目から4文字を取り出す
print substr($string3, 3, 4);

# 3文字目から4文字を取り出して、指定文字列に置き換える
print substr($string4, 3, 4, "opqrstu");

print "After1:$string1";
print "After2:$string2";
print "After3:$string3";
print "After4:$string4";

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

[g@630m pl]$ perl scalar01_03.pl
Before1:abcdefghijklmn
Before2:abcdefghijklmn
Before3:abcdefghijklmn
Before4:abcdefghijklmn
defghijklmn
mn
defgdefgAfter1:abcdefghijklmn
After2:abcdefghijklmn
After3:abcdefghijklmn
After4:abcopqrstuhijklmn
[g@630m pl]$

 substr関数は文字列から部分文字列を取り出し、返します。元の文字列は通常はそのままであることに注意してください。

 第2引数には何文字目から取り出すのかを指定します。マイナスの値を入れると、文字列の後ろから数えた位置が起点になります。第3引数は何文字を取り出すかを指定します。省略すると行末までを取り出します。

 第4引数を指定すると、部分文字列を指定した文字列で置き換えます。この場合だけ、元の文字列が変化します。

substr
文字列から部分文字列を取り出して返す。
書式
substr string, pos, [n, replacement]
引数
string:
操作対象の文字列
pos:
部分文字列を取り出す起点。正の値の場合は先頭から、負の値の場合は行末から数える。
n:
取り出す文字数。省略した場合は行末まで。
replacement:
指定した場合は、部分文字列を指定した文字列で置き換える。
戻り値
部分文字列