我正在我的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";
}
}
答案 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";
}