2016-07-22 125 views
0

我在我的perl腳本中加載和打印製表符分隔的文件。然而,我的輸入文件($ table1)的最後一列是空的,我不想在我的輸出文件($ table3)中打印這個。我該如何以及在哪裏做這件事? '打開'後或在'print $ table3'結束後?perl刪除製表符分隔文件的最後一列

這是我的腳本的一部分(...表示不代碼重要的這個問題)

#! /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

你可以只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"; 
} 
相關問題