我有这样的输入。
a x1
a x1
a y1
b x1
b y1
b z1
c y1
c z1
想要这样的输出
a = 3, x1= 2, y1= 1, z1= 0
b = 3, x1= 1, y1= 1, z1=1
c =2, x1=0, y1=1, z1=1
我想为此制作一个perl程序,但不知道。
请帮助..
答案 0 :(得分:-1)
这是一个非常简单的作业问题(这就是为什么这个问题已被贬低了几次,毫无疑问),但如果你正在努力解决这个问题,那么它就是展示哈希力量的好方法。
让我们打破这个。您希望按第一列对事物进行分类(并计算出现次数),计算关联数据。哈希是完美的。
让我们假设最终的哈希看起来像这样:
{
'a' => {
'*count' => 3,
'x1' => 2,
'y1' => 1,
},
. . .
}
(其中'*count'
是一个永远不会出现在您的数据中的字符串),并且您的输出看起来像您的规范。
解析数据非常简单。
my $hash = {};
my $count = '*count';
for( @lines ) {
chomp;
my ($x, $y) = split( /\s+/ );
$hash->{$x}->{$count}++;
$hash->{$x}->{$y}++;
}
打印出来就是这么简单:
for my $x ( sort keys %{$hash} ) {
my @output = ( sprintf( '%s = %d', $x, $hash->{$x}->{$count} ) );
for my $y ( qw{ x1 y1 z1 } ) {
push( @output, sprintf( '%s = %d', $y, $hash->{$x}->{$y} ) );
}
print join( ', ', @output ) . "\n";
}
请注意,如果$hash->{'c'}->{'z1'}
不存在,则返回的值仍为0.如果您愿意,可以使用exists
进行额外检查,但不一定需要