1. ホーム
  2. スクリプト・コラム
  3. パール

perl は目的のファイルのパスを読み込み、対応するファイルを開きます。

2022-01-29 08:57:39

以下のDNA配列は、window以下のF: \data.txt に格納されています。

コピーコード コードは以下の通りです。

AAAAAAAAAAAAAAGGGGGGGTTTTCCCCCCCC 
CCCCCGTCGTAGTAAAGTATGCAGTAGCVG 
CCCCCCCCCCGGGGGGGGGGAAAAAAAAAAAAAAATTTTTTAT 
AAACG 

以下はその手順です。

コピーコード コードは以下の通りです。

# The following program is used to calculate the number of ATGCs in a segment of DNA sequence

#First define the number of four bases as 0
$count_A=0;
$count_T=0;
$count_C=0;
$count_G=0;
#First, we need to merge the sequence into one line

#First determine the path and filename of the file you want to process (on windows, follow this example)
#f:\\perl\\data.txt
print "please input the Path just like this f:\\\\perl\\\\data.txt\n";
chomp($dna_filename=<STDIN>);
# Open the file
open(DNAFILENAME,$dna_filename)||die("can not open the file!");
# Assign the file to an array
@DNA=<DNAFILENAME>;

# The following two steps are going to combine all the lines into one line and then remove all the white space characters
$DNA=join('',@DNA);
$DNA=~s/\s//g;

# Break the DNA into, and assign it to, an array
@DNA=split('',$DNA);

# Then read the elements of the array in turn and count the number of the four bases
foreach $base(@DNA)
{
 if ($base eq 'A')
 {
  $count_A=$count_A+1;
 }
 elsif ($base eq 'T')
 {
  $count_T=$count_T+1;
 }
 elsif ($base eq 'C')
 {
  $count_C=$count_C+1;
 }
 elsif ($base eq 'G')
 {
  $count_G=$count_G+1;
 }
 else
 {
  print "error\n"
 }
}
# Output the final result
print "A=$count_A\n";
print "T=$count_T\n";
print "C=$count_C\n";
print "G=$count_G\n";


以下は、実行結果です。
コピーコード コードは以下の通りです。

F:\>perl\a.pl
Please input the Path just like this f:\\\perl\\\data.txt
f:\\perl\\\data.txt
error
A=40
T=17
C=27
G=24

F:\>


エラーが表示されることがありますが、これはなぜですか?

一番上の特殊な色でマークされた生のDNA配列をよく見ると、Vがあるので、エラーが出力されるのです。

ここでは、DNA配列を1行にまとめ、空白文字をすべて削除した後、$DNAをsplit関数で配列にし、カウントしていますが、もっと良い方法はないでしょうか?

実はperlにsubstrという関数があるんです。

この関数の使い方を見てみましょう。substr関数は、大きな文字列の一部分だけを扱うので、長い文字列を断片化することになります。つまり、長い文字列を受け取って、それを断片化するのです。それが、ここで使っている機能です。

$little_string =substr($large_string,$start_position,$length)

$little_string =substr($large_string,$start_position,$length 割り込みたい小さな断片の長さ)

ここではDNAの様々な塩基の数を数えるので、扱う文字列は1塩基なので、$lengthを1に設定します。これで必要なものは満たされます。

ここで、修正したコードを書き留めておきます。

コピーコード コードは以下の通りです。

# The following program is used to calculate the number of ATGCs in a segment of DNA sequence

#First define the number of four bases as 0
$count_A=0;
$count_T=0;
$count_C=0;
$count_G=0;
#First, we need to merge the sequence into one line

#First determine the path and filename of the file you want to process (on windows, follow this example)
#f:\\perl\\data.txt
print "please input the Path just like this f:\\\\perl\\\\data.txt\n";
chomp($dna_filename=<STDIN>);
# Open the file
open(DNAFILENAME,$dna_filename)||die("can not open the file!");
# Assign the file to an array
@DNA=<DNAFILENAME>;

# The following two steps are going to combine all the lines into one line and then remove all the white space characters
$DNA=join('',@DNA);
$DNA=~s/\s//g;


# Then read the elements of the string in turn and count the number of the four bases
for ($position=0;$position<length $DNA;++$position)
{
 $base=substr($DNA,$position,1);
 if ($base eq 'A')
 {
  $count_A=$count_A+1;
 }
 elsif ($base eq 'T')
 {
  $count_T=$count_T+1;
 }
 elsif ($base eq 'C')
 {
  $count_C=$count_C+1;
 }
 elsif ($base eq 'G')
 {
  $count_G=$count_G+1;
 }
 else
 {
  print "error\n"
 }
}
# Output the final result
print "A=$count_A\n";
print "T=$count_T\n";
print "C=$count_C\n";
print "G=$count_G\n";

得られた結果は以下の通りです。

コピーコード コードは以下の通りです。

F:\>perl\a.pl
Please input the Path just like this f:\\\perl\\\data.txt
f:\\perl\\\data.txt
error
A=40
T=17
C=27
G=24

F:\>