スクリプト言語 (Perl) -作業途中-
平成26年度(2014年9月1日~12日)に開催された,「バイオインフォマティクス人材育成カリキュラム(次世代シークエンサ)」速習コース講習会1の4日目,服部恵美 氏(アメリエフ株式会社)により「Parl入門」についての実習が行われた. これはその実習の内容について,まとめたものである.
1. Perlの記述方法
- 値を出力するときは最初に
print
と記述する. - 文字列は
""
あるいは''
で囲む. - シェルスクリプトのechoと違って実行後,改行しないので改行コード
¥n
を記述し,""
で囲む¥
は\
と同じ). - 行の末尾には
;
を挿入する.
gedit perl1.pl
#コードを記述する.
print "Hello\n";
perl perl1.pl
#コードを走らせる.
Hello
#走らせた結果(改行コードを入れないとHello%
となる).
- コードが走らない場合は
use strict;
とuse warnings;
をコードの先頭に記述してあげるとバグのレポートを返してくれる. #
で始まる行はコメント扱いとなる。
2. 変数
my $変数名=値;
と記述すると変数に値を代入することができる.$ 変数
と記述すると変数に入っている値を呼び出すことができる.- 複数の変数や文字列を繋げて出力するときは
,
を記述して繋げる.
gedit perl2.pl
#コードを記述する.
my $message="Bye!";
print $message,"\n"; #変数全体を""で囲んでも良い.
perl perl2.pl
#コードを走らせる.
Bye!
#走らせた結果
2.1. 変数の展開
- 変数を
''
で囲むとその変数は展開されない. - 変数を
""
で囲むとその変数は展開される.
gedit perl2.1.pl
#コードを記述する.
my $message="Bye!";
print '$message,\n';
print "$message,\n";
perl perl2.1.pl
#コードを走らせる.
$message\nBye!
#走らせた結果
3. 配列
- 複数の値がある場合
my @配列名=(値,値,.....);
と記述することで,1 つのグループ(配列)にまとめて扱うことができる.
- 配列から任意の値を取り出すときには
$配列名[数字]
と配列名の後に添字[数字]
を付加し,記述することで呼び出すことができる.
- 配列から任意の値を取り出すときには
- 添字は0 から始まるので、先頭の値は「添字0」,2 番目の値は「添字1」となる.
gedit perl3.pl
#コードを記述する.
my @nuc=("A","T","G","C");
print $nuc[2],"\n";
perl perl3.pl
#コードを走らせる.
G
#走らせた結果3番目の「G」が示された.
3.1. 連結
- 変数を連結する場合には
,
以外に.
も使える. qw/文字 文字 文字...../
記述すると('文字','文字','文字'..... )
同じ意味をもつ.
gedit perl3.1.pl
#コードを記述する.
my @nuc=qw/A T G C/;
print $nuc[2],"\n";
perl perl3.1.pl
#コードを走らせる.
G
#走らせた結果先ほどと同様に3番目の「G 」が示された.
3.2. 配列に値を追加する
配列[添字]= 値
と記述すると添字に値が入力される(使用していない添字を記述しないとすでに使用している添字の値が書き替えられる).push
を使うと値を追加できる.
gedit perl3.2.pl
#コードを記述する.
my @nuc=("A","T","G","C");
$nuc[4]="N"; #添字は4以降の数字であれば何でもよい.
push @nuc,"Y"; #splice関数を使うと配列の途中に挿入できるらしい.
print $nuc[4];
print $nuc[5],"\n";
perl perl3.2.pl
#コードを走らせる.
NY
#走らせた結果
3.3. 配列の要素数を調べる
int(@配列)
と記述すると配列を数値に変換する.$#配列
は配列数の最後の添字を出力するので+1
をすれば要素数が求まる.
gedit perl3.3.pl
#コードを記述する.
my @nuc=("A","T","G","C");
print $nuc=int(@nuc),"\n";
print $nuc=$#nuc+1,"\n";
perl perl3.3.pl
#コードを走らせる.
4
#2行目を走らせた結果
4
#3行目を走らせた結果
3.4. 配列と文字列を相互に変換する
join("結合に使う文字", 配列)
と記述すると配列を結合して文字列にする.
gedit perl3.4.1.pl
#コードを記述する.
my @nuc=("A","T","G","C");
my $gene=join('_',@nuc);
print $gene,"\n";
perl perl3.4.1.pl
#コードを走らせる.
A_T_G_C
#走らせた結果
split(/分割に使う文字/, 文字列)
と記述すると文字列を分割して配列にする.
gedit perl3.4.2.pl
#コードを記述する.
my $nuc='A,T,G,C';
my @gene=split(/,/,$nuc);
print $gene[0],"\n";
perl perl3.4.2.pl
#コードを走らせる.
A
#走らせた結果
4. 引数
- 引数は
@ARGV
という専用の配列で受けとる.
gedit perl4.pl
#コードを記述する.
print "Num:",int(@ARGV),"\n"; #引数の数をカウントする.
print "3rd:",$ARGV[2],"\n"; #添字が2なので3番目の引数が入力される.
perl perl4.pl Pink Red Blue
#Pink Red Blue
の引数を指定してコードを走らせる.
Num:3
#1行目のコードを走らせた結果
3rd:Blue
#2行目のコードを走らせた結果
5. ハッシュ
- 値がたくさんあって各データに名前をつけたい時は,「ハッシュ」を使い各データの名前 (キー)と値を対で入力する.
- ハッシュに値を入れるには
my %ハッシュ名=(キー=>値);
と記述する. ハッシュ名{キー}
と記述するとハッシュから値を取り出すことができる(ハッシュに入れた値は添字では取り出せず,キーで引っぱってくる).
gedit perl5.pl
#コードを記述する.
my %atom=("H"=>1,"He"=>2,"Li"=>3);
print $atom{"He"},"\n";
perl perl5.pl
#コードを走らせる.
2
#コードを走らせた結果キーHe
の値=2
が出力された.
5.1. ハッシュにキーと値を追加する
$ハッシュ名{キー}=値
と記述すると追加することができる( 配列と違ってハッシュは添字でアクセスしないため最初に入力する順番とは無関係).
gedit perl5.1.pl
#コードを記述する.
my %atom=("H"=>1,"He"=>2,"Li"=>3);
$atom{"Fe"}=26;
print $atom{"Fe"},"\n";
perl perl5.1.pl
#コードを走らせる.
26
#コードを走らせた結果
6. 条件付き処理
- 以下のような
if-elsif-else
構文を使いコードを記述する.
if(条件1)
{ ~条件1を満たした時 処理~}
elsif(条件2){~条件1 満たさなかったが、 条件2を満たした時 処理~}
else{~どの条件も満たさなかった時 処理~}
- 比較演算子で条件を指定する.
数値の比較演算子 | 文字列の比較演算子 |
A==B (A=Bなら) | AeqB (AとBが同じなら) |
A!=B (A≠Bなら) | AneB (AとBが異なれば) |
A (A | |
A<=B (A≦Bなら) | - |
A>=B (A≧Bなら) | - |
A>B (A>Bなら) | - |
- 複数の条件を指定することもできる.
条件1&&条件2
(条件1AND条件2)条件1 || 条件2
(条件1OR条件2)! 条件1
(条件1でなければ)
gedit perl6.pl
#コードを記述する.
my $i=$ARGV[0];
if($i>=10){
print "$i is equal to or larger than 10\n";}
else{
print "$i is smaller than 10\n";}
perl perl6.pl 6
#引数に6
を入力しコードを走らせる.
6 is smaller than 10
#コードを走らせた結果
perl perl6.pl 11
#引数に11
を入力しコードを走らせる.
11 is equal to or larger than 10
#コードを走らせた結果
7. 繰り返し処理
while(繰り返し条件){処理内容}
と記述すると条件を満たす間繰り返す。
gedit perl7.pl
#コードを記述する.
my @nuc=("A","T","G","C");
my $i=int(@nuc); #iはnucの要素数4とする.
while($i>0){ #iが0より大きい間繰り返し処理を行う.
$i=$i-1; #iをi-1とする(1回目はi=3,2回目はi=2,3回目はi=1...).
print $nuc[$i],"\n"; #nuc[添字i]を出力する.
}
perl perl7.pl
#コードを走らせる.
C
#コードを走らせた結果(1回目の値)
G
#コードを走らせた結果(2回目の値)
T
#コードを走らせた結果(3回目の値)
A
#コードを走らせた結果(4回目の値)
- 以下のように記述すると配列を逆順に出力することができる。
my @nuc=("A","T","G","C");
my $i=0; #iは0とする.
while ($i<int(@nuc)){ #iがnucの要素数4より少ない間繰り返し処理を行う.
print $nuc[$i],"\n"; #nuc[添字i]を出力する.
$i=$i+1; #iはi+1とする.
}
- 繰り返し処理には
while
以外にforeach
やfor
などもある。
7.1. 「for」を使う場合
- 変数の値の変化に応じて繰り返すときには「for(変数の初期値; 繰り返し条件; 変数増分){処理内容}」
gedit perl7.1.pl
#コードを記述する.
my @nuc=("A","T","G","C");
for(my $i=int(@nuc); $i>0; $i=$i-1){
print $nuc[$i-1],"\n";
}
perl perl7.1.pl
#コードを走らせる.
C
#コードを走らせた結果(1回目の値)
G
#コードを走らせた結果(2回目の値)
T
#コードを走らせた結果(3回目の値)
A
#コードを走らせた結果(4回目の値)
$i=$i-1
は$i--
と記述しても良い.- 以下のように記述すると配列を逆順に出力することができる。
my @nuc=("A","T","G","C");
for (my $i=0; $i<int(@nuc);$i=$i+1){
print $nuc[$i],"\n";
}
$i=$i+1
は$i++
と記述しても良い.
7.2. 「foreach」を使う場合
- 配列の各要素(値)に対して繰り返すときには「foreach $変数(@配列){処理内容}」と記述する.
gedit perl7.2.pl
#コードを記述する.
my @nuc=("A","T","G","C");
foreach my $i(reverse @nuc){
print $i,"\n";
}
perl perl7.2.pl
#コードを走らせる.
C
#コードを走らせた結果(1回目の値)
G
#コードを走らせた結果(2回目の値)
T
#コードを走らせた結果(3回目の値)
A
#コードを走らせた結果(4回目の値)
- 以下のように記述すると配列を逆順に出力することができる。
my @nuc=("A","T","G","C");
foreach my $i(@nuc){
print $i,"\n";
}
- 平成26年度NGS速習コース講習会 - バイオサイエンスデータベースセンター - NBDC (https://biosciencedbc.jp/human/human-resources/workshop/h26) ↩