[[2, 4, 5, 3],
[3, 5, 4, 2],
[3, 1, 4, 0],
[0, 5, 1, 2],
[2, 1, 5, 0],
[0, 4, 1, 3]]
dummy.pepmasses
YCL049C 1 511.2465 0 0 MFSK
YCL049C 2 4422.3098 0 0 YLVTASSLFVA
YCL049C 3 1131.5600 0 0 DFYQVSFVK
YCL049C 4 1911.0213 0 0 SIAPAIVNSSVIFHDVSR
YCL049C 5 774.4059 0 0 GVAMGNVK
YCL049C 6 261.1437 0 0 SR
应该有更好的方式来表达这一点。怎么会这样 ? 我想拿起第三列并将其推入一个数组。有更好的方法吗?
答案 0 :(得分:4)
我将通过您的代码和评论
open (IFILE, $dummyfile) or die "unable to open file $dummyfile\n ";
您应该使用显式模式的3参数打开和词法文件句柄。此外,除非您要禁止行号,否则不应在die
消息中包含换行符。您还应该包含错误$!
。
open my $fh, "<", $dummyfile or die "Unable to open $dummyfile: $!";
while (my $line = $dummyfile){
#read each line in file
不,这只是复制文件名。要从文件句柄中读取,请执行以下操作:
while (my $line = <IFILE>) {
如果您使用词汇文件句柄,则为<$fh>
。
chomp $line;
my $mz_value = (split/\s+/,$line)[3]; #pick column 3rd at every line
这实际上是第4列,因为索引从零0
开始。
$mz_value = join "\n"; # add "\n" for data
join
不起作用。将值列表加入字符串是join EXPR, LIST
。您需要连接运算符.
:
$mz_value = $mz_value . "\n";
或更恰当地说:
$mz_value .= "\n";
但为什么这样呢?在打印时添加换行符更简单。
print "@mzco";
你可以这样做:
print "$_\n" for @mzco;
或者如果你感觉大胆:
use feature 'say';
say for @mzco;
为了向您展示Perl的强大功能,该程序可以使用许多内置功能简化为单行程序:
perl -lane ' print $F[3] ' dummy.pepmasses
-l
chomp lines,添加换行符(默认情况下)以打印-n
将while (<>)
循环放在代码中:读取输入文件或stdin -a
将每行自动分为@F
。作为文件的程序如下所示:
$\ = $/; # set output record separator to input record separator
while (<>) {
chomp;
my @F = split;
print $F[3];
}