推,大文件。正确和改进

时间:2015-11-15 10:40:19

标签: perl

[[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

应该有更好的方式来表达这一点。怎么会这样 ? 我想拿起第三列并将其推入一个数组。有更好的方法吗?

1 个答案:

答案 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,添加换行符(默认情况下)以打印
  • -nwhile (<>)循环放在代码中:读取输入文件或stdin
  • -a将每行自动分为@F

作为文件的程序如下所示:

$\ = $/;     # set output record separator to input record separator
while (<>) {
    chomp;
    my @F = split;
    print $F[3];
}