2017-06-02 72 views
0

进出口超出第一行目前新到perl ....Perl的打印在表格

所以我有一个表:

 
Name  Age  
Steven  18 
Joe   19 
Peter  20 

,我想在我的剧本打印出来的行“名称”中的第一列 所以它看起来是这样,当我运行该脚本:

 
Steven  
Joe 
Peter 

我的脚本看起来像这样ATM:

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

my $file=$ARGV[0]; 

my @array; 
my $line; 
my $row; 

open (File, "< $file") or die "Input file: $!"; 

@array = <File>; 

foreach $line (@array) 
{ 
    my @array1 = split(/\s+/, "$line"); 
    my @row=split(/\s+/, "$array1[0]"); 

    print $row[1]; 
}  

当我运行它我似乎无法打印出我的数组字符串'史蒂文'。 我可以有一些指导吗?

+0

您确实已将您的线段拆分并存储到'array1'中。这个变量是你的行。 – slowjack2k

+0

不需要第二个“拆分”线。不需要引用变量,使用'$ line'和'$ array1 [0]'。对空格进行“拆分”的好方法是'split'',$ line;'其中''''是[split]的特殊模式(https://perldoc.perl.org/functions/split.html)(阅读链接的文档页面)。打开我的$ fh,'<',$ file或者“无法打开$ file:$!”,使用三参数'open'(直接更好) – zdim

回答

1

其中一个行是多余的:

my @array1 = split(/\s+/, "$line"); 
my @row=split(/\s+/, "$array1[0]"); 

这种工作方式所需:

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

my $file=$ARGV[0]; 
my @array; 
my $line; 
my $row; 

@array = <DATA>; 
my $isContent = 0; 
foreach $line (@array) 
{ 
    my @row = split(/\s+/, $line); 
    next if not @row; 
    next if not $isContent++; 
    print "$row[0]\n"; 
} 

__DATA__ 

Name  Age 
Steven  18 
Joe   19 
Peter  20 
5

下面是做到这一点的Modern Perl方式:

use strict; 
use warnings; 
use 5.010; 

while (<DATA>) { 
    next if $. == 1; 
    my ($name, $age) = split; 
    say $name; 
} 

__DATA__ 
Name  Age 
Steven  18 
Joe   19 
Peter  20 

注:

  • 如果您可以避免将整个文件读入内存,那么您通常希望避免它,并且在这种情况下,您可以避免它。
  • 我们跳过标题行使用$.,这是the current line number for the last filehandle accessed
  • 当省略split的参数时,它将作用于$_并拆分为' ',这会在拆分前删除前导空白,并将该模式​​视为/\s+/
  • say就像print,只是它隐式附加换行符。它会自动启用use 5.010或更高版本。