-3
我有一个像这样的输入。如何计算每列中的频率,对应于perl中的第一列
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程序的输出,但不知道。
请帮助..
我有一个像这样的输入。如何计算每列中的频率,对应于perl中的第一列
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程序的输出,但不知道。
请帮助..
这是一个非常简单的家庭作业的问题(这就是为什么这已经downvoted几次,毫无疑问),但它是,如果你”显示哈希的力量的好方法重新为之奋斗。
让我们来分析一下。您想按第一列对事物进行分类(并计算出现次数),然后对相关数据进行计数。哈希对此非常完美。
让我们假设最终散列将是这个样子:
{
'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
额外检查如果你喜欢,但不应该有必要。
我会亲自避免将计数嵌入到散列中 - 依赖于“从不出现的东西”是糟糕的程序逻辑。为什么不改用subhashes上的'values'? – Sobrique
...或单独的'count_of'散列?这不像你用字节支付。 – Sobrique