Perl はテキスト処理を得意とするプログラミング言語である。文字列の結合、切り出し、置換や正規表現によるマッチングなどが柔軟に行うことができる。
文字列検索
Perl で文字列検索を行うには index
または rindex
を利用する。index
は文字列を先頭から検索するのに対して、rindex
は文字列を後尾から検索する。両者ともに 2 つの引数を受け取る。1 番目の引数には検索対象の文字列を、2 番目の引数に検索したい文字列を与える。検索がヒットすれば、その位置番号が返される。検索がヒットしなかった場合は、-1 を返す。
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
文字列のパターンマッチング
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(3) - 1);
## end position: 47
文字列の結合
連結したい文字列の間にピリオドを挿入することで、2 つの文字列を 1 つの文字列に結合させることができる。
my $dna_1 = "AGCTACGTAGTATT";
my $dna_2 = "ATGCTAGCAAATATATAAAA";
my $dna = $dna_1 . $dna_2;
print $dna;
## AGCTACGTAGTATTATGCTAGCAAATATATAAAA
文字列の切り出し
文字列の切り出しは 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
文字列の置換
文字列の置換は substr
関数あるいは s
演算子を利用する。
substr
substr
関数の最初の 3 つの引数で置換対象の位置を指定し、4 番目の引数で置換後の文字列を与える。例えば 4 文字目から 6 文字目までの文字列を XXX に置換したい場合は次のようにする。
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 = "AAGCAGTXCXGAGCAGXTXAGXTXA";
$dna =~ s/X(.)X/C$1C/g;
print $dna;
## AAGCAGTCCCGAGCAGCTCAGCTCA
文字列の分割
文字列をある区切り文字に基いて、配列に分割するときは split
を利用する。split
に与える区切り文字は正規表現でも可。
my $dna = "ACAGTGTATGCCTGCTATGCAGTCGTA";
my @segments = split(/ATG/, $dna);
foreach my $seg (@segments) {
print $seg, "\n";
}
## ACAGTGT
## CCTGCT
## CAGTCGTA