2.10.2. 配列#

配列は複数の値を保存できるデータ構造です。保存される複数の値には 0、1、2、… のように添え字(index)が付けられます。変数名とともに添え字を指定することで、その添え字に対応する値を取得したり保存したりできます。

2.10.2.1. 配列の宣言と初期化#

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

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

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

2.10.2.2. 要素の取り出し for foreach#

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

2.10.2.2.1. for#

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

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

2.10.2.2.2. 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

2.10.2.3. 配列要素の削除#

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

2.10.2.4. 配列要素の追加#

Perl では、配列の先頭に要素を追加するには unshift 関数を利用し、末尾に要素を追加するには push 関数を利用します。

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

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

push(@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

2.10.2.5. 文字列を配列に分割#

文字列を指定した区切り文字に従って部分文字列に分割し、それぞれを配列に格納できます。このとき、文字列の分割には 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

2.10.2.6. 配列を文字列に変更#

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

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

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

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

配列に保存されている値のうち、特定のパターンにマッチした要素だけを抽出して出力できます。この処理には 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";
}