配列

一般的に使われる変数は、一つの値をしか保存できない。これに対して、配列は複数の値を保存できる。保存される複数の値は 1、2、3、・・・のように添え字が付けらる。変数の名前とともに添え字を与えることで、その添字に対応する値を取得したり、保存したりすることができる。

配列の宣言と初期化

一般的な変数は、変数名の前に $ を付ける。これに対して、配列は変数名の前に @ を付ける。配列に複数の値を代入するとき、各々の値をカンマで区切り、それらの外側に括弧を付ける。

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


# 複数行に分けて書くこともできる
my @miRNA = (
  'CGAGGGGGUGCAGGACUUGACGGCUGCAACUGUGCGGCCGGCCACACCGUCAGUGCAGCGU',
  'CAGAUAAAUAGAAUACUAAGUAAAAAAUCAGUAUGGAGGUUUAGUUUGG',
  'AAGGAGCACUCACUCCAAUUUCCCUGGACUGGGGGCAGGCUGCAGGAUGUUCCAG'
);

配列のすべての要素を取り出す方法

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

# 配列を用意
my @arr = ("A", "C", "D", "B");

# for文で取り出す方法
for (my $i = 0; $i < @arr; $i++) {
  print $arr[$i] . "\n";
}

# foreach文で取り出す方法
foreach my $ele (@arr) {
  print $ele . "\n";
}

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

# ソート
foreach my $ele (sort @arr) {
  print $ele . "\n";
}

# 逆順
foreach my $ele (reverse @arr) {
  print $ele . "\n";
}

文字列を配列に分割

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

# 文字列
my $csv = "NM200102.1,NM200110.2,NM200121.1,NM200123.2";

# カンマを区切り文字として分割し、その結果を@accession 配列に保存
my @accession = split(/,/, $csv);

# @accession 配列の全要素を出力
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

pop, push, shift, unshift

配列に対して、要素を配列の最後に追加したり、配列の先頭にに追加したりすることができる。

関数動作
pop配列の後尾の要素を切り出す。配列のサイズは 1 小さくなる。
shift配列の先頭の要素を切り出す。配列のサイズは 1 小さくなる。
push配列の後尾に要素を追加する。配列のサイズは 1 大きくなる。
unshift配列の先頭に要素を追加する。配列のサイズは 1 大きくなる。
my @arr = ('A', 'B', 'C');

push(@arr, 'D');          #「('A', 'B', 'C', 'D')」となる

unshift(@arr, "X");       #「('X', 'A', 'B', 'C', 'D')」となる

my $ele1 = pop(@arr);     #「('X', 'A', 'B', 'C')」となる。$ele1 には 'D' が代入される

my $ele2 = shift(@arr);   #「('A', 'B', 'C')」となる。$ele2 には 'X' が代入される

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

配列に保存されている値のうち、あるパターンにマッチした値だけを出力することができる。grep 関数を利用してパターンマッチ行う。

# 配列方のデータを用意
my @seq = ("AAGTCGATTCAGG", "GTAGTATGCATGTCA", "AGTGCTAGCTTTT", "ACAGTATGCATGC");

# 要素に「ATG」を含めば、配列@atgに保存する
my @atg = grep(/ATG/, @seq);

# 新しく作った@atg配列の全要素を出力する
foreach my $ele (@atg) {
   print "$ele\n";
}


# 次のようにすれば @atg という配列を作らなくてもできる
foreach my $ele (grep(/ATG/, @atg)) {
   print "$ele\n";
}