2016-07-22 2 views
0

私はperlスクリプトでタブ区切りファイルをロードして印刷しています。しかし、私の入力ファイル($ table1)の最後の列は空で、出力ファイル($ table3)にこれを表示したくありません。どのようにすればいいですか? 'open $'または '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最後のヘッダを削除し、そのハッシュスライスに1つの以下の列を格納する可能性があります。しかし、私は、私はchomp

を使用して「余分な」カラムは、このようなコードから来たjoin "\t", ..., "\n"のパラメータリスト内の改行を持っているので、それだけでs/\t?\n\z//の代わりに改行する直前のタブを削除するのが最善だろうと想像します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"; 
} 
関連する問題