0

我有一个包含单词和数字的文本文件。

我想搜索一个关键词,如果文件包含该词搜索第二个词,如果存在我想提取第二个词旁边的数字。

我想对两个关键词和两个第二个词(即两次相同的事情,但每次不同的词)执行此操作。

然后我想将数字放入一个数组中并按数字排序。

到目前为止,但是当我将数组 1 加入数组 2 时,数组 1 的输出会发生变化(有些数字是重复的)。我需要一种方法来合并这两个操作。

my $filename;

my $filenamein = 'seq_id.txt';
open( my $fh, '<:encoding(UTF-8)', $filenamein )
    or die "Could not open file '$filename' $!";

while ( my $row = <$fh> ) {

    my $string = $row;

    my $startword = "16S ribosomal RNA";

    for ( $string =~ /$startword/ ) {

        my $word1 = "start:";
        $string =~ /$word1\s*?(\S+)/;
        my $next_word1 = $1;
        @w1 = ( $next_word1, );

        my $startword2 = "23S ribosomal RNA";

        for ( $string =~ /$startword2/ ) {

            my $word2 = "End";
            $string =~ /$word2\s*?(\S+)/;
            my $next_word2 = $1;
            @w2 = ( $next_word2, );
        }
    }
4

2 回答 2

0

你的代码在这里有几个问题,这意味着它几乎肯定没有按照你的想法做。

首先也是最重要的 - 打开use strict;use warnings;。这将警告你一些令人讨厌的事情正在发生。

例如:

for ( $string =~ /$startword/ ) {

for迭代一个列表。但$string =~ /$startword/不是清单。它将返回一个值,具体取决于匹配是否有效。这充其量是一种非常丑陋的写if声明的方式。

你还有:

        my $word1 = "start:";
        $string =~ /$word1\s*?(\S+)/;
        my $next_word1 = $1;
        @w1 = ( $next_word1, )

正在做的事情可以简化为:

my ( $word1 ) = ( $string =~ /start:\s*(\S+)/ );

但是随后您将@w1使用单个元素覆盖 list 。这就是你的意思吗?你不使用@w1其他任何地方。

目前所拥有的可能会简化为:

use strict;
use warnings;

my $filenamein = 'seq_id.txt';
open( my $fh, '<:encoding(UTF-8)', $filenamein )
    or die "Could not open file '$filenamein' $!";

while ( my $row = <$fh> ) {
    if ( $row =~ m/16S ribosomal RNA/ ) {
        my ($next_word1) = ( $row =~ /start:\s*?(\S+)/ );
        my @w1 = ( $next_word1, );
    }

    if ( $row =~ /23S ribosomal RNA/ ) {
        my ($next_word2) = ( $row =~ /End\s*?(\S+)/ );
        my @w2 = ( $next_word2, );
    }
}

你也在做一些很奇怪的事情@w1-@w2它们是列表,但它们只会被分配一个元素。这不太可能是你的意思。

于 2015-07-09T09:42:52.883 回答
0

非常感谢您的帮助,非常感谢。我意识到我可能知道的不够多,所以请人帮忙!

这似乎对我有用!

my $i;
my $filename;

my $filenamein = 'testin.txt';

open( my $fh, '<:encoding(UTF-8)', $filenamein )
    or die "Could not open file '$filename' $!";

while ( my $row = <$fh> ) {

    my $string = $row;

    my $startword = "16S ribosomal RNA";

    if ( $string =~ /$startword/ ) {

        my $word1 = "start:";
        $string =~ /$word1\s*?(\S+)/;
        my $next_word1 = $1;
        push( @w1, $next_word1 );

        print "Start @w1\n";

    }

    my $startword2 = "23S ribosomal RNA";

    if ( $string =~ /$startword2/ ) {

        my $word2 = "End";
        $string =~ /$word2\s*?(\S+)/;
        my $next_word2 = $1;
        push( @w2, $next_word2 );

        print "End @w2\n";

    }    # critical ender 2

}    #opener
于 2015-07-10T12:32:54.583 回答