Hash是亂序的(除非用Tie::IxHash),所以基本上不能排出壹個順序Hash。只能靠壹個數組去找——“如果是排序的,那麽鍵的順序是什麽?”
在Hash中,鍵永遠是絕對唯壹的,所以在妳目前的條件下,即使我上面提到有壹個IxHash可以做有序hash,在這裏也不適用。
這裏有壹個sub供妳參考:
sub?rebuildHash?{
我的?%argv?=?@_;
我的?(?%重建?,?@回歸?);
什麽時候?(?我的?(?$k,?$v?)?=?每個?%argv?)?{
如果?(定義?$rebuild{$v}?)?{
如果?(?不是嗎?裁判?$rebuild{$v}?)?{
我的?$prevKey?=?$rebuild{$v}?;
$rebuild{$v}?=?[?$prevKey,?$k?];
}
不然呢?{?#?$重建?是嗎?不是嗎?安?數組?裁判員
推?@{$rebuild{$v}},?$k
}
}
不然呢?{?#?如果?這個?鑰匙?是嗎?不是嗎?甚至?存在
$rebuild{$v}?=?$k
}
}
foreach?我的?$k?(?排序?{ $ a & lt= & gt$b}?鑰匙?%重建?)?{?#?使用?{?$a?cmp?$b?}?為了什麽?字符串?分類
如果?(?裁判?$rebuild{$k}?)?{
推?@返回,?@ { $ rebuild { $ k } }
}
不然呢?{
推?@返回,?$ rebuild { $ k };
}
}
回歸?@返回
}
#main
我的?%h?=?(?壹個?= & gt?1,?兩個?= & gt?2,?另壹個?= & gt?1,?三個?= & gt?3?)?;
我的?@已排序?=?rebuildHash?%h?;
foreach?我的?$sd?(?@已排序?)?{
打印?“$sd?= & gt?$h{$sd}?$/"
}
__END__
另壹個?= & gt?1?
壹個?= & gt?1?
兩個?= & gt?2?
三個?= & gt?三