2015-03-13 80 views
0

下面的代碼提供的你如何格式化打印計數的輸出

Female4946Male5054gender1 

如何元素及其數量之間加空格的結果,爲什麼它打印了1陣列旁邊?

#!/usr/bin/perl 

use strict; 
use warnings; 

my @gender; 
my $female=0; 

while (<>) { 
    chomp; 
    my @fields = split /,/; 
    push @gender, $fields[5]; 
} 

my %count; 
$count{$_}++ for @gender; 
print %count; 

回答

0

你可能有一個標題行中包含gender爲列標題輸入文件和讀取並計數一次。通過從文件句柄讀取一行到void來跳過第一行。

<>; 

要在每一對之間插入一個空格(但不能在最後一對之後),請使用join。用換行

print join " ", map {"$_: " . $count{$_} } keys %count; 
print "\n"; 

或者更漂亮(從我的角度來看),它們之間:爲map的代碼塊將建設爲每一對字符串

while(my ($gender => $count) = each %count) { 
    print "$gender: $count\n"; 
} 
+1

哈希值不雙引號內插。 – choroba 2015-03-13 08:30:46

+0

你說得對。我不應該發佈這個。刪除相應的塊。 – 2015-03-13 08:31:50

+0

@DanielBöhmer如何讓他們在同一行上打印,但是他們之間有空格? – 2015-03-13 08:40:46

2

不打印一個數組,你正在打印一個散列。使用循環打印它(您可以將其隱藏到map中)。另外,爲什麼你可以填充@gender數組,當你可以直接創建哈希?

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

my %count; 

while (<>) { 
    chomp; 
    my @fields = split /,/; 
    $count{ $fields[5] }++; 
} 

for my $gender (keys %count) { 
    print $gender, ' ', $count{$gender}, "\n"; 
} 

1末來源於在其第六列哈希gender線(可能是頭?),你可以delete $count{gender}打印之前,或while循環前添加<>忽略標題。

+0

請解釋*「您不打印數組,您正在打印散列」*。 OP沒有提及任何地方的數組或哈希。我希望很明顯,如何使用@ @ gender來澄清代碼。 – Borodin 2015-03-13 20:40:01

+0

@Borodin:'print%count'是*打印散列*,而問題提到*打印數組*(從位置145開始)。 – choroba 2015-03-13 21:34:03

1

所有你需要的是

print join(' ', %count), "\n" 

輸出

Female 4946 Male 5054 gender 1