番号 歴史 世界史 合計
1   50   10    60
2   60   80    140
3   10   60    70
これを各項目別にソートしたいです。

思いついたのは

$d[0][0]→1   $d[1][0]→0:50   $d[2][0]→0:10   $d[3][0]→0:60
$d[0][1]→2   $d[1][1]→1:60   $d[2][1]→1:80   $d[3][1]→1:140
$d[0][2]→3   $d[1][2]→2:10   $d[2][2]→2:60   $d[3][2]→2:70
多次元配列に入れる


歴史の順でソートする場合
sort(@d[1])←ここは自信ないです(d[1]の中をソートしたいんです)

foreach(@d[1]){
($num,$data) = split(/:/);
print "$d[0][$num]","$_","$d[2][$num]","$d[3][$num]";
}


と言う方法です。各要素に、はじめの添え字を記録して、それをsplitで分解して、それを添え字にする、とい方法ですが、
これは、かなり無駄な気がします・・・
もうすこしきれいなのはありませんか?