我有一个包含单词和数字的文本文件。
我想搜索关键字,如果文件包含该字搜索第二个字,如果存在,我想提取第二个字旁边的数字。
我想为两个关键词和两个第二个词(即两次相同的词,但每次都有不同的词)这样做。
然后,我想将数字放入数组中并按数字排序。
我到目前为止,但是当我将它连接到数组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, );
}
}
答案 0 :(得分: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
。这是你的意思吗?您不在其他地方使用@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
做一些非常奇怪的事情 - 它们是列表,但它们只被分配了一个元素。这不太可能是你的意思。
答案 1 :(得分: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