2016-07-22 2 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

I рекомендуется поместить некоторые круглые скобки вокруг параметров 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"; 
} 
Смежные вопросы