perl删除制表符分隔文件的最后一列

时间:2016-07-22 14:50:11

标签: perl

我正在我的perl脚本中加载和打印制表符分隔的文件。但是我输入文件的最后一列($ table1)是空的,我不想在输出文件($ table3)中打印它。我该怎么做? '打开'或在'打印$ table3'结束后?

这是我脚本的一部分(...表示对此问题不重要的代码)

#! /usr/bin/perl
use strict;
use warnings;

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
use Getopt::Long qw(GetOptions);;

...

open(my $table1,'<', $input) or die "$! - [$input]"; #input file 
open(my $table3, '+>', $output) || die ("Can't write new file: $!"); #output file

...

chomp( my @header_for_table1 = split /\t/, <$table1> );

print $table3 join "\t", @header_for_table1, "name1", "name2", "\n";

{
    no warnings 'uninitialized';
    while(<$table1>){
         chomp;
         my %row;
         @row{@header_for_table1} = split /\t/;
         print $table3 join ( "\t", @row{@header_for_table1},
                   @{ $lookup{ ... }
                        // [ "", "" ] }), "\n";
}
}

1 个答案:

答案 0 :(得分:1)

您可以pop @header_for_table1删除最后一个标头,因此在散列片中存储少一列。但我认为“额外”列来自这样的代码,在join "\t", ..., "\n"的参数列表中有换行符,所以最好只在s/\t?\n\z//换行符之前删除标签使用chomp

我建议您在join参数周围添加一些括号,否则您将在每行末尾创建更多带有备用标签的文件。这是对您所显示的代码的重构,以及其他一些改进

#! /usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
use Getopt::Long qw(GetOptions);

my ($input, $output);
my %lookup;

...;

open my $in_fh,  '<', $input  or die "$! - [$input]";

...;

my @header = do {
    my $header = <$in_fh>;
    $header =~ s/\t?\n\z//;
    split /\t/, $header;
};

open my $out_fh, '>', $output or die "Can't write new file: $!";

print $out_fh join("\t", @header, qw/ name1 name2 /), "\n";

while ( <$in_fh> ) {
     s/\t?\n\z//;

     my @row = split /\t/;

     my $names = $lookup{ ... };
     my @names = $names ? @$names : ('', '');

     print $out_fh join("\t", @row, @names), "\n";
}