【发布时间】:2011-10-02 02:29:59
【问题描述】:
我有一个制表符分隔符。文本文件由许多行和列组成。我想更改前两列的内容,然后将修改后的文件写入新文件。
在更改之前,每行的前两列如下所示:
COLUMN1:
dip:DIP-41935N|refseq:NP_056092|uniprotkb:Q96PU5
COLUMN2: dip:DIP-48957N|uniprotkb:P49281
我希望它们只包含每列末尾的 id 号,所以我希望它们如下所示:
COLUMN1: Q96PU5
COLUMN 2: P49281
我已在选项卡上拆分行以获取各个列。然后拆分前 2 列以获得所需的 ID 号 ($prot_id)。然后我尝试用 ID 替换第 1 列和第 2 列的内容。但是,更改后的文件中的输出与我预期的不同。相反,它看起来像这样:
COLUMN1:
Q96PU5|refseq:NP_056092|uniprotkb:Q96PU5
COLUMN 2:
P49281|uniprotkb:P49281
仅列的第一部分已被替换。我一直在玩这个几个小时,无法弄清楚我做错了什么。非常感谢任何帮助。 我的代码如下:
#!/usr/bin/perl
use warnings;
use strict;
my $file = 'DIP.txt';
open(INFILE, $file) or die "Can't open file: $!\n";
open(my $outfile, '>', 'DIP_changed.txt');
my @lines = <INFILE>;
foreach $_ (@lines) {
my @columns = split('\t', $_);
my $col1 = $columns[0];
my $col2 = $columns[1];
my @split_col1 = split ('uniprotkb:', $col1);
my @split_col2 = split ('uniprotkb:', $col2);
my $prot_id1 = $split_col1[length(@split_col1)];
my $prot_id2 = $split_col2[length(@split_col2)];
print $prot_id1, "\n";
s/$col1/$prot_id1/;
s/$col2/$prot_id2/;
print {$outfile} $_;
}
exit;
【问题讨论】:
-
my $prot_id1 = $split_col1[length(@split_col1)];没有做您最可能想要的事情 - 可能是数组的最后一个索引。length返回字符串中的字符数。要索引数组中的最后一个元素,只需使用 'my $prot_id1 = $split_col1[ -1 ];`