Perl、配列の初期化と要素の出し入れ

配列

配列は複数の値を保存できる。保存される複数の値は 0、1、2、・・・のように添え字が付けらる。変数の名前とともに添え字を与えることで、その添字に対応する値を取得したり、保存したりすることができる。

配列の宣言と初期化

配列は、変数名の前に @ を付ける。配列に複数の値を代入するとき、各々の値をカンマで区切り、それらを括弧で囲む。

my @primer = ('AGTCCGTGCGGCAA', 'GTATTTACATCCCA', 'CAGTGCTATGTCCA');

my @miRNA = (
    'CGAGGGGGUGCAGGACUUGACGGCUGCAACUGUGCGGCCGGCCACACCGUCAGUGCAGCGU',
    'CAGAUAAAUAGAAUACUAAGUAAAAAAUCAGUAUGGAGGUUUAGUUUGG',
    'AAGGAGCACUCACUCCAAUUUCCCUGGACUGGGGGCAGGCUGCAGGAUGUUCCAG'
);

要素の取り出し for foreach

配列に保存されているすべての要素を順に取り出すとき、for 文または foreach 文を利用する。

for

my @arr = ("A", "C", "D", "B");

for (my $i = 0; $i < @arr; $i++) {
    print $arr[$i] . "\n";
}
## A
## C
## D
## B

foreach

foreach my $ele (@arr) {
    print $ele . "\n";
}
## A
## C
## D
## B

sort 関数を利用することで、配列の要素を並べ替えて出力することができる。また、reverse 関数を利用することで、配列を逆順に出力することができる。

my @arr = ("A", "C", "D", "B");

foreach my $ele (sort @arr) {
    print $ele . "\n";
}
## A
## B
## C
## D

foreach my $ele (reverse @arr) {
    print $ele . "\n";
}
## D
## C
## B
## A

配列要素の削除

Perl では、配列の先頭の要素を削除するには shift 関数を利用し、最後の要素を削除するには pop を利用する。また、配列の途中にある要素を削除するには splice を利用する。

my @arr = ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K");

my $a = shift(@arr);

print $a;
## A
print @arr;
## BCDEFGHIJK


my $b = pop(@arr);

print $b;
## K
print @arr;
## BCDEFGHIJ

my $c = splice(@arr, 2, 3);

print $c
##
print @arr;
## BCGHIJ

配列要素の追加

Perl では、配列の先頭要素の前に追加するには unshift 関数を利用し、最後要素の後ろに追加するには push を利用する。

my @arr = ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K");

unshift(@arr, "0");
print @arr;
## 0ABCDEFGHIJK

poush(@arr, "Z");
print @arr;
## 0ABCDEFGHIJKZ

配列の途中で要素を追加するには splice を利用する。splice 関数は 4 つの引数を受け取る。1 番目の引数は操作対象の配列を代入する。2 番目の引数は操作開始位置を指定する。3 番目の引数は操作開始位置から何文字を削除するのかを指定する、削除しない場合は 0 を指定する。4 番目の引数は、操作開始位置に挿入する配列を指定する。

my @arr = ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K");
splice(@arr, 2, 0, ("a", "b", "c"));
print @arr;
## ABabcCDEFGHIJK

文字列を配列に分割

文字列をある区切り文字に従って部分文字列に分割し、各々を一つの配列に収めることができる。この際、文字列の分割は split 関数を利用する。split 関数の 1 つ目の引数には区切り文字のパターンを、2 つ目の引数には分割対象文字列を代入する。

my $csv = "NM200102.1,NM200110.2,NM200121.1,NM200123.2";

my @accession = split(/,/, $csv);

for (my $i = 0; $i < @accession; $i++) {
    print $accession[$i] . "\n";
}
## NM200102.1
## NM200110.2
## NM200121.1
## NM200123.2

配列を文字列に変更

配列の要素をすべて連結して、一つの文字列にすることができる。配列の要素の連結は join 関数を利用する。文字列を連結するときに利用する区切り文字を指定することができる。

my @data = (21, 31, 11, 12, 14, 11);
my $csv = join(',', @data);

print $csv . "\n";
## 21,31,11,12,14,11

配列中のあるパターンにマッチした要素だけを出力する方法

配列に保存されている値のうち、あるパターンにマッチした値だけを出力することができる。grep 関数を利用してパターンマッチ行う。例えば、複数の要素を含む配列から、文字列 ATG を含む要素だけ取り出す場合は、次のようにする。

my @seq = ("AAGTCGATTCAGG", "GTAGTATGCATGTCA", "AGTGCTAGCTTTT", "ACAGTATGCATGC");

my @atg = grep(/ATG/, @seq);
foreach my $ele (@atg) {
     print "$ele\n";
}

foreach my $ele (grep(/ATG/, @atg)) {
     print "$ele\n";
}