0

我是 Perl 的新手,所以我需要一些帮助。我正在编写一个程序,用户可以给我最多 3 种不同类型的输入,我需要提取特定数据。

用户可以给我以下三个中的任何一个:ASP_72_2 D72_2 72_2(ASP = 残基名称,D = ASP 的残基代码,72 = 残基数,2 = 跨膜数)

有没有一种巧妙的方法将数据存储在一行中?

我的想法(伪代码)是检查每个输入的子字符串,如下所示。

if ((substr($input, 0,3)) eq 'ASP')
{
        do way 1;
}elsif ((substr($input,0,1)) eq 'D'))
{
        do way2;
}

等等……等等……最终,我希望能够处理不同的残基名称、不同的残基代码、残基编号和 TM 编号。

4

3 回答 3

2

我会使用单独的正则表达式,但同时使用捕获来提取数字:

if ($input =~ /^ASP_(\d+)_(\d+)$/) {
    &do_way1($1, $2);
} elsif ($input =~ /^D(\d+)_(\d+)$/) {
    &do_way2($1, $2);
} elsif ($input =~ /^(\d+)_(\d+)$/) {
    &do_way3($1, $2);
} else {
    print "Input not recognized: $input\n";
}

然后像这样写你的各种 do_wayx() :

sub do_way1 {
    my ($residue_number, $transmembrane_number) = @_;
    # ... do your stuff
}
于 2013-07-26T08:41:42.963 回答
1

你描述的是一种有效的方式,虽然我会用正则表达式来做:

    if ($input =~ /^ASP/){
        do_way1($input);
    }
    elsif ($input =~ /^D/){
        do_way2($input);
    }
    elsif ($input =~ /^\d{2}/){
        do_way3($input);
    }
    else {
        not_recognized($input);
    }

sub do_way1 {
    my $input = shift;
    ...
}
...
于 2013-07-26T05:59:40.557 回答
0

使用一个正则表达式

use strict;

my @input = qw(ASP_72_2 D72_2 72_2 AST_33 BD_33);

foreach (@input){

   if(my ($type, $value) = /^(ASP_|72_|D)(.*)/){
      print "type = $type, value = $value\n";
   }else{
      print "couldn't match $_\n";
   }
}
于 2013-07-26T06:10:08.517 回答