-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