2017-06-02 70 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或更高版本。