0

我正在尝试在我的程序中过滤一个分隔文本文件的数组。此文本文件中的数组如下所示:

YCL049C                   1     511.2465  0 0 MFSK
YCL049C                   2    4422.3098  0 0 YLVTASSLFVALT
YCL049C                   3    1131.5600  0 0 DFYQVSFVK
YCL049C                   4    1911.0213  0 0 SIAPAIVNSSVIFHDVSR
YCL049C                   5     774.4059  0 0 GVAMGNVK
..
.

我为这部分程序提供的代码是:

my @msfile_filtered;
my $msline;
foreach $msline (@msfile) {

    my ($name, $pnum, $m2c, $charge, $missed, $sequence) = split (" ", $msline);
    if (defined $amino) {

        if ($amino =~ /$sequence/i) {

            push (@msfile_filtered, $msline);

        }

    }
    else {

        push (@msfile_filtered, $msline);

    }

}

$amino 将只是一个将由用户输入的字母,并且对应于最后一个字段 $sequence。用户实际输入 $amino 并不是必需的,因此我需要复制此数组并在这种情况下保持不变(因此使用 else 语句)。目前@msfile_filtered 数组为空,但我不确定为什么,有什么想法吗?

编辑:为了澄清,每个字段之间只有一个空格,我从 notpad++ 复制并粘贴了这个,所以添加了额外的空格。文件本身在字段之间只有一个空格。

提前致谢!

4

2 回答 2

3

尝试查找匹配行的正则表达式是向后的。大海捞针,你需要写$haystack =~ /needle/,而不是相反。

此外,为了简化您的逻辑,如果$aminoundef,请完全跳过循环。我会重写你的代码如下:

if (defined $amino)
{
    foreach $msline (@msfile)
    {
        my ($name, $pnum, $m2c, $charge, $missed, $sequence) = split(" ", $msline);
        push @msfile_filtered, $msline if ($sequence =~ /$amino/i);
    }
} else
{
    @msfile_filtered = @msfile;
}

您可以将其进一步简化为单个grep语句,但这开始变得难以阅读。此类行的一个示例可能是:

@msfile_filtered =
    defined $amino
        ? grep { ( split(" ", $_ ) )[5] =~ /$amino/i } @msfile
        : @msfile;
于 2013-11-03T14:28:09.940 回答
1

拆分应该采用多个空格,而正则表达式变量则反之亦然。

首先调试以检查拆分后的值是否正确。

此外,您必须像这样交换正则表达式变量:

 if ($sequence =~ /$amino/i) {

现在您正在检查 $amino 是否包含 $sequence,显然它不包含

于 2013-11-03T14:31:31.397 回答