2015-03-13 67 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