Perl 在列中并排打印文件标题行和文件中的每一行

Perl 在列中并排打印文件标题行和文件中的每一行,perl,Perl,嗨,我有一个tsv文件,我正试图打印标题行和文件的每一行并排,即在列中。 不幸的是,我对如何在打印语句中加入行感到有点困惑 #/usr/bin/perl 严格使用; 使用警告; 本地$“=”'\n'; 我的@temp; 而(){ 咀嚼; my@columns=join“\t”,$; 按@temp,按@columns; } 我的$Header\u行=班次(@temp); 我的头; 我的$abc; my@abc=拆分(/\t/,$Header\u行); 我的$abc(@abc){ 按@head,$a

嗨,我有一个tsv文件,我正试图打印标题行和文件的每一行并排,即在列中。 不幸的是,我对如何在打印语句中加入行感到有点困惑

#/usr/bin/perl
严格使用;
使用警告;
本地$“=”'\n';
我的@temp;
而(){
咀嚼;
my@columns=join“\t”,$;
按@temp,按@columns;
}
我的$Header\u行=班次(@temp);
我的头;
我的$abc;
my@abc=拆分(/\t/,$Header\u行);
我的$abc(@abc){
按@head,$abc.“\n”;
}
我的@roows;
我的$元素;
foreach(@temp){
咀嚼;
我的$line=$\ux;
my@elements=split(“\t”,$line);
对于$elements(@elements){
推送@roows,$elements。“\n”;
}
}
#打印@head,$abc.“\n”;
#打印@roows,$elements。“\n”;
__资料__
年吨级货物类型
8861t运米车
89 55克玉米列车
92 93 S豌豆船
所需输出 输出

Year    88
Tonn    61  
Class   T   
Cargo   Rice    
Type    Truck

Year    89
Tonn    55  
Class   G   
Cargo   Corn    
Type    Train

Year    92
Tonn    93  
Class   S   
Cargo   Peas    
Type    Ship

实际上,在循环打印之前,不需要将所有行读入
@temp
。只读取第一行以获取标题,然后循环打印其余行会更有效:

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

my @temp;

my $line = <DATA>;
chomp($line);
my @head = split "\t", $line;

foreach $line (<DATA>) {
    chomp($line);
    my @elements = split ("\t", $line);
    foreach my $i (0..$#head) {
        print $head[$i], "\t", $elements[$i], "\n";
    }
    print "\n";
}

__DATA__
Year    Tonn    Class   Cargo   Type
88  61  T   Rice    Truck
89  55  G   Corn    Train
92  93  S   Peas    Ship

我只是觉得把所有的部分分开会更清楚一些。

在循环打印之前,真的没有必要把所有的行都读到
@temp
中。只读第一行就可以得到标题,然后循环打印剩余的行,这样效率会更高:

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

my @temp;

my $line = <DATA>;
chomp($line);
my @head = split "\t", $line;

foreach $line (<DATA>) {
    chomp($line);
    my @elements = split ("\t", $line);
    foreach my $i (0..$#head) {
        print $head[$i], "\t", $elements[$i], "\n";
    }
    print "\n";
}

__DATA__
Year    Tonn    Class   Cargo   Type
88  61  T   Rice    Truck
89  55  G   Corn    Train
92  93  S   Peas    Ship

我只是觉得把所有部分分开会更清楚一些。

根据您的来源,这应该可以做到:

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

#read the header line into @header;     
my $header_line = <DATA>;
chomp $header_line;
chomp ( my @header = split ( ' ', $header_line ); 

#iteraate data fh    
while ( <DATA> ) {
    #strip linefeed 
    chomp;
    #read this row into a hash 
    my %row; @row{@header} = split;
    #print this hash in the same order as the header.  
    #note - $_ is set to each element of header in turn when doing this. 
    print "$_\t$row{$_}\n" for @header;
    #insert extra linefeed
    print "\n";
}

__DATA__
Year    Tonn    Class   Cargo   Type
88  61  T   Rice    Truck
89  55  G   Corn    Train
92  93  S   Peas    Ship
!/usr/bin/env perl
严格使用;
使用警告;
#将标题行读入@header;
我的$header_行=;
chomp$header\u行;
chomp(my@header=split(“”,$header\u行);
#iteraate数据跳频
而(){
#条状送料
咀嚼;
#将此行读入散列
我的%row;@row{@header}=split;
#按与标题相同的顺序打印此哈希。
#注意-$在执行此操作时依次设置为标头的每个元素。
为@header打印“$\uT$行{$\u}\ n”;
#插入额外换行符
打印“\n”;
}
__资料__
年吨级货物类型
8861t运米车
89 55克玉米列车
92 93 S豌豆船
注意-您可以将“读取标题”进一步压缩为:

chomp ( my @header = split ( ' ', <DATA> ) ); 
chomp(my@header=split(“”,);

这也有同样的作用,但可能更难理解。

根据您的来源,这应该可以做到:

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

#read the header line into @header;     
my $header_line = <DATA>;
chomp $header_line;
chomp ( my @header = split ( ' ', $header_line ); 

#iteraate data fh    
while ( <DATA> ) {
    #strip linefeed 
    chomp;
    #read this row into a hash 
    my %row; @row{@header} = split;
    #print this hash in the same order as the header.  
    #note - $_ is set to each element of header in turn when doing this. 
    print "$_\t$row{$_}\n" for @header;
    #insert extra linefeed
    print "\n";
}

__DATA__
Year    Tonn    Class   Cargo   Type
88  61  T   Rice    Truck
89  55  G   Corn    Train
92  93  S   Peas    Ship
!/usr/bin/env perl
严格使用;
使用警告;
#将标题行读入@header;
我的$header_行=;
chomp$header\u行;
chomp(my@header=split(“”,$header\u行);
#iteraate数据跳频
而(){
#条状送料
咀嚼;
#将此行读入散列
我的%row;@row{@header}=split;
#按与标题相同的顺序打印此哈希。
#注意-$在执行此操作时依次设置为标头的每个元素。
为@header打印“$\uT$行{$\u}\ n”;
#插入额外换行符
打印“\n”;
}
__资料__
年吨级货物类型
8861t运米车
89 55克玉米列车
92 93 S豌豆船
注意-您可以将“读取标题”进一步压缩为:

chomp ( my @header = split ( ' ', <DATA> ) ); 
chomp(my@header=split(“”,);

这也有同样的作用,但可能有点难以理解。

你想做什么还不是很清楚。看起来你只是想读入内容,然后再打印出来,我不明白你为什么要修改它们。一个预期输出的示例会有帮助。你想做什么还不是很清楚。看起来就像你只是想读入内容,然后再打印出来,我不明白你为什么要修改它们。举一个预期输出的例子会有所帮助