我正在尝试将散列添加到我的散列中,如下所示:
%funkce = (
"funkce1" => {
"file" => "soubor1",
"name" => "jmeno1",
"varargs" => "args",
"rettype" => "navrat",
"params" => [
"typ",
"typ2"
]
},
"funkce2" => {
"file" => "soubor2",
"name" => "jmeno2",
"varargs" => "args",
"rettype" => "navrat",
"params" => [
"typ",
"typ2"
]
}
);
$delka = keys %funkce;
$funkce{ "funkce" . ($delka + 1)} = {
"file" => "soubor3",
"name" => "jmeno3",
"varargs" => "args",
"rettype" => "navrat",
"params" => [
"typ",
"typ2"
]
};但是有一个问题。最后一个散列是在%function中作为第一个添加,但我希望它是最后一个散列。我怎么才能修复它?我做得对吗?谢谢
发布于 2012-04-06 04:29:39
散列不保证插入顺序。你要求它散列你的密钥,所以x > y <=/=> f(x) > f(y)
如果您想要保证插入顺序,尽管我认为没有理由引入(tie的)开销,但一个标准方法是使用Tie::IxHash。
列表有结尾,而不是散列。散列是从一组名称或ids到一组对象或值的数学映射。如果我们把狗的名字想成狗的名字,那么,尽管我们可以按字母顺序排列狗的名字,但真的没有“第一只狗”。
从你所展示的来看,
push( @funkce
, { "file" => "soubor1"
, "name" => "jmeno1"
, "varargs" => "args"
, "rettype" => "navrat"
, "params" => [ qw<typ typ2> ]
});也会工作得一样好。在$funkce[$i]上输入$funkce{'funcke2'}而不是$funkce[2]或$funkce{ '$funkce' . $i }几乎没有什么好处,而且如果您要增加其他名称,那么您的分区应该是这样的:$funkce{'funkce'}[2] // $funkce{'superfunkce'}[2]
对名称的离散部分使用散列,对数字使用数组,这是编写数据的好方法。与$funkce{'funkce2'}一样,$funkce{'funkce'}[2]完全是一个单独的实体。
发布于 2012-04-06 04:52:35
如果需要有序项,请使用数组;如果需要命名(无序)项,请使用散列。要获得接近有序散列的内容,您需要嵌套数组/散列,或者对散列进行排序,或者使用一些绑定类。
嵌套
@funkce = (
{ name => "funkce1",
"file" => "soubor1",
"name" => "jmeno1",
"varargs" => "args",
"rettype" => "navrat",
"params" => [
"typ",
"typ2"
]
},
{ name => "funkce2",
"file" => "soubor2",
"name" => "jmeno2",
"varargs" => "args",
"rettype" => "navrat",
"params" => [
"typ",
"typ2"
]
}
);
push @funkce, {
name => "funkce3",
"file" => "soubor3",
"name" => "jmeno3",
"varargs" => "args",
"rettype" => "navrat",
"params" => [
"typ",
"typ2"
]
};排序
%funkce = ( ... ); # as in OP
# when using
foreach my $item (sort keys %funkce) {
# do something with $funkce{$item}
}并列
请参阅Tie::IxHash,但正如阿克斯曼所说,您可能不需要/不想要这个。
https://stackoverflow.com/questions/10035480
复制相似问题