这是Suic用户的脚本,用于计算Fasta序列(calculating molecular weight in perl)的分子量,
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
for my $file (@ARGV) {
open my $fh, '<:encoding(UTF-8)', $file;
my $input = join q{}, <$fh>;
close $fh;
while ( $input =~ /^(>.*?)$([^>]*)/smxg ) {
my $name = $1;
my $seq = $2;
$seq =~ s/\n//smxg;
my $mass = calc_mass($seq);
print "$name has mass $mass\n";
}
}
sub calc_mass {
my $a = shift;
my @a = ();
my $x = length $a;
@a = split q{}, $a;
my $b = 0;
my %data = (
A=>71.09, R=>16.19, D=>114.11, N=>115.09,
C=>103.15, E=>129.12, Q=>128.14, G=>57.05,
H=>137.14, I=>113.16, L=>113.16, K=>128.17,
M=>131.19, F=>147.18, P=>97.12, S=>87.08,
T=>101.11, W=>186.12, Y=>163.18, V=>99.14
);
for my $i( @a ) {
$b += $data{$i};
}
my $c = $b - (18 * ($x - 1));
return $c;
}
和具有n个(这里是2个)序列的protein.fasta文件:
seq_ID_1说明等 ASDGDSAHSAHASDFRHGSDHSDGEWTSHSDHDSHFSDGSGAGAADADGHHAH ASDSADGDASHDASHSAREWAWGDASHASGASGASGSDGASDGDSAHSHAS SFASGDASGDSDSSDFDSFSDFSD
>seq_ID_2 descriptions etc
ASDGDSAHSAHASDFRHGSDHSDGEWTSHSDHDSHFSDGSGASGADGHHAH
ASDSADGDASHDASHSAREWAWGDASHASGASGASG
使用时:perl Molecular_weight.pl蛋白.fasta> output.txt 在终端中,它将生成正确的结果,但是还会出现错误“在Molecular_weight.pl第36行使用附加的附加值(+)使用单位化值”,该错误仅位于“ $ b + = $ data {$一世};”如何解决这个错误?预先感谢!
答案 0 :(得分:1)
您的数据文件中某处可能有错误的空格。只是改变
$seq =~ s/\n//smxg;
进入
$seq =~ s/\s//smxg;
编辑:
除空格外,数据中可能还包含一些非空格不可见字符,例如WORD JOINER(U + 2060)。
如果您想确保操作彻底,并且知道所有合法符号,则可以删除除它们之外的所有内容:
$seq =~ s/[^ARDNCEQGHILKMFPSTWYV]//smxg;
或者,为确保您不会丢失任何内容(即使您以后更改符号),也可以从哈希键动态填充过滤器正则表达式。
您需要将%Data
和过滤器正则表达式设为全局,因此过滤器可在主循环中使用。作为有益的副作用,您不必每次输入calc_mass()
时都重新初始化数据哈希。
use strict;
use warnings;
my %Data = (A=>71.09,...);
my $Filter_regex = eval { my $x = '[^' . join('', keys %Data) . ']'; qr/$x/; };
...
$seq =~ s/$Filter_regex//smxg;
(只要符号是单个字符,此过滤器就起作用。对于更复杂的符号,最好匹配符号并从序列中收集它们,而不是删除不需要的字符。)