記事ディレクトリ
8.3 Perl 言語の基礎を始める
- 詳細については、ビデオを参照してください: Perl 言語基礎入門-01 P137
● Perl : Practical Extraction and Report Language の公式 Web サイトから無料でダウンロード(ネットワークが悪い場合は開けない場合があります)、複数のオペレーティング システムをサポートします。
- 直訳言語: 通訳言語
- シーケンス処理:特に文字列(シーケンス)処理に適しています。
- ファイル処理:便利で簡潔なファイルの書き込みと書き込み
- パターンマッチング: 正規表現の完全サポート
8.3.1 最初の Perl
- test.pl という名前のテキスト ファイルを作成します。
- 最初の行はPerl 実行環境(インストール パス)を書き込みます。
Linux は次のように書き込みます。#!/usr/bin/perl
Windowsは次のように書き込みます。#!C:/Strawberry/perl/bin/perl.exe
- 2 行目は、次のような単純なステートメントを記述します。
print "He1lo world!";
- test.pl を保存し、cmd コマンド ウィンドウを開きます。
- test.pl が存在するディレクトリに移動します。
cd Desktop
perl test.pl
コマンドを実行して最初のプログラムを実行します。
8.3.2 Perl の基本ルール
- 各ステートメントの後には「
;
」を付ける必要があります。 - コメントの前に「」を追加します。これは1 行
#
でのみ有効です。 - 変数の定義は非常にシンプルでカジュアルです:
◆ 事前に変数を宣言する必要がなく、使いながら定義できます◆ 変数の型
を定義する必要がなく、代入後にプログラムが自動的に判断します。◆ 変数名は大文字と小文字が区別され、文字で始まり、特殊文字は使用できません。◆ 変数名先頭に " " を追加し、値を割り当てるには " " を使用します。$
=
$scalar = expression
●さまざまな引用符の使用:
- 一重引用符は、
''
引用符内のすべてを完全に直訳したものです。
- 二重引用符は、
""
引用符内の変数と反意語を識別できます。
- バッククォートは、
``
引用符内のコンテンツをコマンドとして実行します。
●さまざまな演算子の使用:
-
比較演算子比較演算子:文字列
の比較演算子は、数値の比較演算子とは異なります。◆数字は文字より小さい!◆大文字は小文字よりも小さい!◆小から大まで:数字[0-9]、大文字[AZ]、小文字[az]
-
論理演算子論理演算子:
直接記述できます:or
、and
、not
または代わりに記号を使用できます:||
、&&
、!
特別な論理演算子:xor
XOR
△a xor b = (a' and b) or (a and b')
(a' = not a)
a と b の 2 つの値が同じでない場合、XOR の結果はです1
。a と b の 2 つの値が同じ場合、XOR の結果は次のようになります0
。 -
文字列演算子 文字列演算子:
.
文字列の結合と連結
x
、文字列の繰り返しコピー、結合と連結後の
.=
文字列の代入$string1 = "potato"; $string2 = "head"; $string3 = $string1 . $string2; #patatohead $string4 = $string1 x 2; #patato $string1 .= $string2; #string1 = patatohead
8.3.3 文字列共通関数
-
Perl には多くの定義済み関数があります。
函数名 ( 参数 1, 参数 2,... 参数 n)
注:
パラメーター間のカンマは必須であり、
パラメーターを囲む括弧はオプションです。 -
length
機能:
構文:length($string);
説明: 文字列 $string のバイト値 (長さ) を見つけます。$string="Per15"; $size=length($string); #这时 $size=5 #计算一条氨基酸序列的长度 $seq="GHMGSSVLEELVQLVKDKNIDISIKYDPRKDSEVEANRVITDDIELLKKILAYFLPEDAILKGGHYDNQLQNGIKRVKEFLESSPNTQWELRAFMAVMHFSLTADRIDDDILKVIVDSMNHHGDARSKLREELAELTAE"; $len=length($seq); print "The protein contains $len amino acids.";
-
substr
機能:
構文:substr($string, offset, 1ength);
説明:文字列 $string の部分文字列をインターセプトします。★注意:最初の桁は1ではなく0です。開始文字の位置を表します。offset が負の値の場合、指定された文字は文字列の右側から始まります。参照される文字列の長さを表します。 length を省略した場合、文字列の開始値から最後の文字までの長さを表します。
offset
length
$s1=substr("perl5",2,2); #$s="rl" 从第二个字符串后开始截取 2 个字符串 $s2=substr("perl5",1); #$s="erl5" 从第一个字符串后开始截取剩余字符串 $s3=substr("perl5",-5,3); #$s="per" 从倒数第五个字符串开始截取 3 个字符串 #提取出蛋白质序列的功能区,功能区位于第 12 个氨基酸到第 23 个氨基酸。 $seq="GHMGSSVLEELVQLVKDKNIDISIKYDPRKDSEVEANRVITDDIELLKKILAYFLPEDALKGGHYDNQLQNGIKRVKEFLESSPNTQWELRAFMAVMHFSLTADRIDDDILKVIVDSMNHHGDARSKLREELAELTAE"; $begin=11; $end=22; $length=$end-$begin+1; $region=substr($seq, $begin, $length); print "The functional region is $region.";
-
index
機能:
構文:index($string, $substring, position)
説明:文字列内で検索する文字の位置を返します($substring
$string
最初に見つかった位置のみを返します) 、見つからない場合は戻ります-1
。検索する文字で$substring
あり、検索を開始する位置を表し、省略した場合は先頭から検索されます。
position
$s1=index("pell5","p"); #$s1=0 $s2=index("pell5","l",2); #$s2=2 只返回找到的第一个位置 $s3=index("pell5", "perl"); #$s3=-1 #查找某功能区在一条蛋白质序列里的位置。 $seq="GHMGSSVLEELVQLVKDKNIDISIKYDPRKDSEVEANRVITDDELLKKILAYFLPEDAILKGGHYDNQLQNGIKRVKEFLESSPNTQWELRAFMAVMHFSLTADRIDDDILKVIVDSMNHHGDARSKLREELAELTAE"; $region="KEFLESSPNT"; $begin=index($seq, $region)+1; #起始位置,注意获取 index 后加一 $end=$begin+length($region)-1; #结束位置,注意减一 $begin_aa=substr($region,0,1); #第一个氨基酸 $end_aa=substr($region,-1,1); #最后一个氨基酸 print "The functional region is from $begin_aa$begin to $end_aa$end.";
8.3.4 配列共通関数
-
配列は、括弧
()
で囲まれた要素のセットです。- 要素は、コンマで区切られた任意の値または空に
することができます。 -要素の数はいつでも増減できます。 - 配列は、次のような記号で表されます。 -配列内の要素は、変数と等しく、次のように記述されます。@
@arr("A","T","C","G")
$arr[index_number]
print $arr[0]; #A print $arr[1,3]; #TG print @arr; #ATCG
-
scalar
機能: 要素の数
構文:scalar(@array)
説明:配列@array
内の要素の数を返します。@arr=("A","B","C"); #定义一个数组 $num=scalar(@arr); #这时$num=3 #批量处理一组 Uniprot ID 前,先数数这一组 ID 的个数。 @ids=("Q6GV17", "Q9BXR5", "B3Y669", "COLSK8"); $count=scalar(@ids); print "$count ids : @ids";
-
reverse
機能: 逆順序
構文:reverse(@array)
説明:@array
配列内の要素を後ろから前に逆に配置します。 -
sort
機能: 昇順
構文:sort[{$a<=>$b}](@array)
説明:@array
配列内の要素をASCIIコードの昇順に並べ替えます。追加後、数値のサイズ{$a<=>$b}
で並べ替えます。@arr1=(21,1,2,12); @arr2=reverse(@arr1); #@arr2=(12,2,1,21); 元素逆序 @arr3=sort(@arr); #@arr2=(1,12,2,21) 按字符串大小排序 @arr4=sort{ $a<=>$b}(@arr); #@arr3=(1,2,12,21) 按数字大小排序 #将一组计算结果数值升序/降序排列。 @value=(10,34,24,16,4,7); @value1=sort{ $a<=>$b}(@value); # 升序 @value2=reverse(@value1); # 降序 print "ascending order : @value1\n"; #\n 代表换行 print "descending order : @value2";
-
pop
機能: 最後の要素を削除
構文:pop(@array)
説明:配列@array
の最後の要素を削除し、削除された要素を返します。@arr=("A","B","C"); $rm=pop(@arr); #@arr=("A", "B"), $rm="C"
-
push
機能: 最後に追加
構文:push(@array,$newelement/@newarray)
説明:新しい要素または新しい配列を@array
配列の最後に追加します。@arr=("A","B","C") ; push(@arr,"D") ; #@arr=("A", "B","C","D") #由大到小排序,同时去掉最小值,并在最后添加元素的个数。 @value=(10,34,24,16,4,7); @value1=sort{ $a<=>$b}(@value); @value=reverse(@value); pop(@value); push(@value, scalar(@value)); print "new value : @value";
-
shift
機能: 最初の
要素を削除 構文:shift(@array)
説明: Pop と同様に、配列@array
の最初の要素を削除し、削除された要素を返します。@arr=("A","B","C"); $rm=shift(@arr); #@arr=("B", "C"), $rm="A"
-
unshift
機能: 前に追加
構文:unshift(@array,$newelement/@newarray)
説明: プッシュと同様に、新しい要素または新しい配列を配列@array
の前に追加します。@arr=("A","B"); unshift(@arr,"X") ; #@arr=("X", "A","B") #由大到小排序,同时去掉最大值,并在最前面添加元素的个数。 @value=(10,34,24,16,4,7); @value1=sort{ $a<=>$b}(@value); @value=reverse(@value); shift(@value); unshift(@value, scalar(@value)); print "new value : @value";
-
join
機能: 連結:
構文:説明:配列内の要素を指定join($string, @array)
された文字を含む文字列に連結し、その文字列を結果として返します。$string
@array
@arr=("A" , "B" , "C") ; $get=join(":", @arr); #$get="A:B:C"
-
split
機能: Split :
構文:説明: ( delimiter )に従ってsplit(/pattern/, $string)
文字列を分割し、分割結果を配列に入れます。$string
pattern
$seq="15:32:54"; @arr=split(/:/, $seq) ; #@arr=("15","32","54") # 获取 FASTA 格式序列的纯序列部分。 $fasta=">sp|P33316|DUT_HUMAN MTPLCPRPALCYHFLTSLLRSAMQNARGARQRA EAAVLSGPGPPLGRAAQHGIPRPLSSAGRLSQG CRGASTVGAAGWKGELPKAGGSPAPGPETP"; @line=split(/\n/, $fasta); # 按换行符分割成行数 n 个字符串并放入数组 line shift(@line); # 去掉数组中的第 1 个字符串,即">"开头的第一行 $seq=join("", @line); #拼接其他字符串,即纯序列 print $seq;
8.4 Perl 言語の基礎と応用
8.4.1 if 条件文
●文法 1 :
- if 条件文の「条件」は括弧内にあり、
()
括弧
内の「条件」は論理式です。
論理式が と判定された場合、次の中括弧内の文をtrue
実行します。論理式が と判定された場合、:次の中括弧内のステートメントを実行します。 注: if と else をペアで使用することはできません。つまり、else なしの if のみが存在できますが、if なしの else だけではありません。if
{}
false
else
{}
$a=10; $b=15; if ($a > $b) { print "a is bigger!"; } else { print "b is bigger!"; }
●文法 2 :
- 論理式1が次のように判定された場合
true
: ステートメント1を実行 - 論理式 1 が と判定された場合
false
:
引き続きelsif
次の論理式 2 を判定
論理式 2 が真と判定された場合 : ステートメント2 を実行
論理式 2 が偽と判定された場合 : ステートメント 3 を実行if ($a == 5) { print '$a is 5'; } elsif ($a == 10) { print '$a is 10'; } elsif ($a == 15) { print '$a is 15'; } else { print '$a is not (5 or 10 or 15)'; }
8.4.2 for ループ文
●文法 1:for
- init は最初に実行され、一度だけ実行されます。このステップでは、ループ制御変数を宣言して初期化します。例:
$i=1
; - 次に状態を判定します。true の場合、ループ本体が実行されます。false の場合、実行は行われません。例えば:
$i<10;
- ループ本体の実行後、制御フローはインクリメントステートメントに戻り、ループ制御変数を更新します。例えば:
$i++
- 再度条件を判定し、条件が偽となりループが終了するまで上記の処理を繰り返します。
# 九九乘法表 for ($i=1; $i<10; $i++) { for($j=1; $j<10; $j++) { $x=$i*$j; print "$i x $j = $x\t"; } print "\n"; }
●文法2:foreach
foreach (@array) {
statement1;
……
}
-
配列内の各要素に対して
@array
、ループの本体を実行します。(配列を走査する) -
変数を使用して、
$_
現在のサイクルでキャプチャされた現在の要素を表します。 -
配列内の各要素が順番に回転された後、ループは終了します。
# 奇数偶数? @a=(1, 12, 33, 25, 98, 34, 55, 76, 18, 10); foreach (@a) { if ($_ % 2 == 0) # % 取余数 { print "$_ is even. \n"; } else { print "$_ is odd. \n"; } }
8.4.3 ファイルの読み書き
-
ファイルを読み取る:
open(FH, "read.txt");
現在のパスにある read.txt ファイルを開きます。FH はファイルの読み取りおよび書き込みイベントの識別子であり、名前はそれ自体で定義できます。
@get = <FH>;
読み取ったファイルの内容を配列に格納し@get
、改行 "\n" に従って要素を分割します(つまり、1 行に 1 つの要素)。
close FH;
読み込み後はファイルフラグFHを閉じてください。open(FH, "read.txt"); @get = <FH>; close FH;
-
ファイルの書き込み:
open(FH, ">write.txt");
現在のパスで write.txt ファイルを開く/作成し、そこにコンテンツを書き込みます。「>
」は書き出すことを意味し、ファイル内の元の内容は上書きされます。
print FH "Hello world!\n";
「print FH」は、二重引用符の内容を画面に書き出すのではなく、ファイル識別子 FH で表されるファイルに書き出すことを意味します。
close FH;
書き込み後はファイルフラグFHを閉じてください。open(FH, ">write.txt"); print FH "Hello world!\n"; close FH;
-
ファイルの書き込みを続行する:
open(FH, ">>write.txt");
現在のパスで write.txt ファイルを開いて作成し、そこにコンテンツを書き込みます。「 」は継続>>
を表し、ファイル内の元の内容は上書きされません。同じファイルを書き込みます。書き込み後はファイルフラグFHを閉じてください。
print FH "Hello world!\n";
close FH;
open(FH, ">>write.txt"); print FH "Hello world!\n"; close FH;
-
画面入力:画面は、画面入力を通じて値を割り当てる必要があることを示す
print "What's your name?\n";
文を
$name = <STDIN>;
STDIN に出力します。カーソルはそこに留まり、ユーザーがコンテンツを入力するまで待機し、入力後に Enter キーを押します。chomp関数は、画面上の入力内容の末尾にある改行を削除するために使用されます。取得した画面入力値を出力します。$name
chomp($name);
print "Hello $name!";
print "What's your name?\n"; $name = <STDIN>; chomp($name); print "Hello $name!";
8.4.4 ダウンロードページを取得する
- 基本的なステートメント:
# 引用 LWP 模块,以使用 get 函数
use LWP::Simple;
# 将一个 FASTA 序列的网址赋值给变量 $url
$url='http://www.uniprot.org/uniprot/Q6GV17.fasta';
# get 函数获取$url 网址打开页面的全部内容(获取页面源代码)
$content = get $url;
# 如果网址无法打开,die 函数将强制结束程序,并屏幕打印告知。
die "Couldn't get $url" unless defined $content;
# 将获取的网页内容打印出来。
print $countent;
8.4.5 応用例:一括ダウンロード・保存シーケンス
- シーケンスのバッチダウンロードと保存
use LWP::Simple;
open (FH, ">seq.fasta");
@ids= ("Q6GV17" , "Q9BXR5" , "B3Y669" , "COLSK8");
foreach (@ids) {
$url= "http://www.uniprot.org/uniprot/$_.fasta";
$content = get $url;
die "Couldn't get $url" unless defined $content;
print FH "$countent";
}
close FH;