0

単語と数字を含むテキスト ファイルがあります。

キーワードを検索したいのですが、ファイルにその単語が含まれている場合は、2 番目の単語を検索します。存在する場合は、2 番目の単語の隣の数字を抽出したいと思います。

これを 2 つのキーワードと 2 つの 2 番目の単語 (つまり、同じことを 2 回繰り返しますが、毎回異なる単語) に対して実行したいと考えています。

次に、数値を配列に入れて、数値で並べ替えたいと思います。

これまでのところ、配列 1 からの出力は、配列 2 に結合すると変更されます (一部の数値が重複しています)。両方の操作をマージする方法が必要です。

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また、 and で非常に奇妙なことを行ってい@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 に答える