如何修复Perl脚本中的“除...外还使用统一值”错误?

时间:2019-03-02 00:49:17

标签: perl

这是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 {$一世};”如何解决这个错误?预先感谢!

1 个答案:

答案 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;

(只要符号是单个字符,此过滤器就起作用。对于更复杂的符号,最好匹配符号并从序列中收集它们,而不是删除不需要的字符。)