2.10.5. 文字列#
Perl はテキスト処理を得意とするプログラミング言語です。文字列の結合、切り出し、置換、正規表現によるマッチングなどを柔軟に行うことができます。
2.10.5.1. 文字列検索#
Perl で文字列検索を行うには index または rindex を利用します。index は文字列を先頭から検索するのに対して、rindex は文字列を末尾から検索します。いずれも 2 つの引数を受け取ります。1 番目の引数には検索対象の文字列、2 番目の引数には検索したい文字列を与えます。検索がヒットすれば、その開始位置のインデックスが返されます。検索がヒットしなかった場合は -1 が返されます。インデックスは 0 から始まる点に注意してください。
my $dna = "CATTGTACGTCGCGTAGCCATGTACGTCGCAGT";
my $pos1 = index($dna, "TAC");
print $pos1;
## 5
print substr($dna, $pos1, 3);
## TAC
my $pos2 = rindex($dna, "TAC");
print $pos2;
## 22
print substr($dna, $pos2, 3);
## TAC
print index($dna, "XXX");
## -1
2.10.5.2. 文字列のパターンマッチング#
Perl では正規表現を利用したパターンマッチングが可能です。マッチした部分は後から参照(後方参照)することも簡単にできます。後方参照を利用する場合、参照したいパターンを () で囲み、複数ある場合は複数の () を用います。その後、左から順に $1、$2 のように参照します。
my $dna = "AGCGAGCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAAAATA";
$dna =~ /(.*)(GCCC.+TAAA)(.*)/;
print $1;
## AGCGA
print $2;
## GCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAA
print $3;
## AATA
print "start position: " . (length($1) - 1);
## start position: 4
print "end position: " . (length($3) + length($2) + length($1) - 1);
## end position: 47
2.10.5.3. 文字列の結合#
連結したい文字列の間にピリオド . を挿入することで、2 つの文字列を 1 つの文字列に結合できます。
my $dna_1 = "AGCTACGTAGTATT";
my $dna_2 = "ATGCTAGCAAATATATAAAA";
my $dna = $dna_1 . $dna_2;
print $dna;
## AGCTACGTAGTATTATGCTAGCAAATATATAAAA
2.10.5.4. 文字列の切り出し#
文字列の切り出しには substr を利用します。1 番目の引数に対象となる文字列、2 番目の引数に切り出し開始位置、3 番目の引数に切り出す長さを指定します。2 番目の引数に負の値を与えると、末尾から数えた位置になります。また、3 番目の引数を省略すると、指定した開始位置から文字列の末尾までが切り出されます。
my $dna = "AAACCCGGGTTT";
print substr($dna, 0, 3);
## AAA
print substr($dna, 3);
## CCCGGGTTT
print substr($dna, -3);
## TTT
あるパターンにマッチした部分の文字列を取得したい場合は、正規表現でマッチングを行った後、後方参照を利用します。例えば AAA と GGG に挟まれた部分の文字列を切り出す場合は、次のように記述します。
my $dna = "AAACCCGGGTTT";
$dna =~ /AAA(.+)GGG/;
print $1;
## CCC
2.10.5.5. 文字列の置換#
文字列の置換には substr 関数または s 演算子を利用します。
substr 関数では、最初の 3 つの引数で置換対象の位置と長さを指定し、4 番目の引数で置換後の文字列を与えます。例えば 4 文字目から 6 文字目までを XXX に置換する場合は次のようにします。インデックスは 0 から始まるため、開始位置は 3 になります。
my $dna = "AAACCCGGGTTT";
substr($dna, 3, 3, "XXX");
print $dna;
## AAAXXXGGGTTT
s 演算子を利用すると、正規表現に基づいて文字列の置換が行えます。例えば、dna 中のすべての X を C に置換する場合は次のようにします。
my $dna = "AGACXGTAXCGXTA";
$dna =~ s/X/C/g;
print $dna;
## AGACCGTACCGCTA
dna 中の最初の X のみを C に置換する場合は次のようにします。
my $dna = "AGACXGTAXCGXTA";
$dna =~ s/X/C/;
print $dna;
## AGACCGTACCGXTA
dna 中の AXA をすべて CCC に置換します。
my $dna = "AAAAXAAACCCXCCCAAXAGGGTTTT";
$dna =~ s/AXA/CCC/g;
print $dna;
## AAACCCAACCCXCCCACCCGGGTTTT
X.X パターン(. は任意の 1 文字)を C.C に置換します。
my $dna = "AAGCAGT<strong>XCX</strong>GAGCAG<strong>XTX</strong>AG<strong>XTX</strong>A";
$dna =~ s/X(.)X/C$1C/g;
print $dna;
## AAGCAGT<strong>CCC</strong>GAGCAG<strong>CTC</strong>AG<strong>CTC</strong>A
2.10.5.6. 文字列の分割#
文字列を区切り文字に基づいて配列に分割する場合は split を利用します。split に与える区切り文字は正規表現でも指定できます。
my $dna = "ACAGTGTATGCCTGCTATGCAGTCGTA";
my @segments = split(/ATG/, $dna);
foreach my $seg (@segments) {
print $seg, "\n";
}
## ACAGTGT
## CCTGCT
## CAGTCGTA