文字列

Perl はテキスト処理を得意とするプログラミング言語である。文字列の結合、切り出し、置換や正規表現によるマッチングなどが柔軟に行うことができる。

文字列検索

文字列検索を行うには index または rindex を利用する。1 番目の引数に検索対象文字列を、2 番目の引数に検索クエリーを与える。index は文字列を先頭から検索するのに対して、rindex は文字列を後尾から検索する。

my $dna = "CATTGTACGTCGCGTAGCCATGTACGTCGCAGT";

# 先頭から"TAC"を検索
print index($dna, "TAC");
## 5

# 後尾から"TAC"を検索
print rindex($dna, "TAC");
## 22

# 検索されなかった場合は-1を返す
print index($dna, "XXX");
## -1

文字列のパターンマッチング

Perl は正規表現による文字列マッチングをサポートする。マッチングと同時に後方参照も簡単でできる。

my $dna = "AGCGAGCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAAAATA";

# 「GCCC」で開始し、「TAAA」で終了するパターンを検索し、その開始位置と終了位置を出力する
# 括弧で囲むことによって、後から順に$1、$2により括弧内の文字列を参照できる

$dna =~ /(.*)(GCCC.+TAAA)(.*)/;

print "開始位置: " . (length($1) - 1);
print "終了位置: " . (length($3) + length($2) + length(3) - 1);
print "部分文字列: " . $2;
## 開始位置: 4
## 終了位置: 47
## 部分文字列: GCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAA

文字列の結合

連結したい文字列の間にピリオドを挿入することで、2 つの文字列を 1 つの文字列に結合させることができる。

my $dna_1 = "AGCTACGTAGTATT";
my $dna_2 = "ATGCTAGCAAATATATAAAA";

my $dna = $dna_1 . $dna_2;

print $dna;
## AGCTACGTAGTATTATGCTAGCAAATATATAAAA

文字列の切り出し

substr を利用して文字列の切り出しを行う。1 番目の引数に切り出しの対象文字列、2 番目の変数には切り出し開始位置、3 番目の変数には切り出す文字列の長さを与える。2 番目の変数にマイナスの値を与えると、切り出し位置は後ろから数えることになる。

my $dna = "AAACCCGGGTTT";

print substr($dna, 0, 3);  # 1 文字目から長さ 3 の文字列を切り出す
## AAA

print substr($dna, 3);     # 4 文字目から最後まで切り出す
## CCCGGGTTT

print substr($dna, -3);    # 後ろから3文字目から最後までの文字列を切り出す
## TTT

あるパターンにマッチした部分の文字列を取得する場合、正規表現によるマッチングを行った後、後方参照により文字列を取得する。

my $dna = "AAACCCGGGTTT";

# AAAとGGGに囲まれた部分の文字列を切り出す例
$dna =~ /AAA(.+)GGG/;

print $1;
## CCC

文字列の置換

文字列置換は s 演算子あるいは substr を利用する。

以下は s 演算子を利用した例である。

my $dna = "AGACXGTAXCGXTA";

# dna 中のすべての X を C に置換
$dna =~ s/X/C/g;
print $dna;
## AGACCGTACCGCTA


$dna = "AGACXGTAXCGXTA";

# dna 中の最初の X だけを C に置換
$dna =~ s/X/C/;
print $dna;
## AGACCGTACCGXTA


$dna = "AAAAXAAACCCXCCCAAXAGGGTTTT";

# 「AXA」パターンを「CCC」に置換
$dna =~ s/AXA/CCC/;
print $dna;
## AAACCCAACCCXCCCACCCGGGTTTT



$dna = "AAGCAGTXCXGAGCAGXTXAGXTXA";

# 1 番目に「X」、2 番目に任意の一文字、3 番目に「X」となるパターンのとき、
# 最初と最後の「X」を「C」に置換し、2 番めの文字はそのまま残す例です
$dna =~ s/X(.)X/C$1C/g;
print $dna;
## AAGCAGTCCCGAGCAGCTCAGCTCA

substr を利用した置換例。

my $dna = "AAACCCGGGTTT";

# 4文字目〜6文字目をXXXに置換する例
substr($dna, 3, 3, "XXX");  # 4 文字目から 7 文字目までの文字をXXXに置換

print $dna;
## AAAXXXGGGTTT

文字列の分割

文字列をある区切り文字に基いて、配列に分割するときは split を利用する。split に与える区切り文字は正規表現でも可。

my $dna = "ACAGTGTATGCCTGCTATGCAGTCGTA";

# ATG で文字列を分割する例
my @segments = split("ATG", $dna);
# my @segments = split(/ATG/, $dna);  # 正規表現も利用できる

foreach my $seg (@segments) {
  print $seg, "\n";
}
## ACAGTGT
## CCTGCT
## CAGTCGTA