首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl将Hash添加到最后的Hash of Hash中

Perl将Hash添加到最后的Hash of Hash中
EN

Stack Overflow用户
提问于 2012-04-06 04:24:48
回答 2查看 2K关注 0票数 0

我正在尝试将散列添加到我的散列中,如下所示:

代码语言:javascript
复制
  %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中作为第一个添加,但我希望它是最后一个散列。我怎么才能修复它?我做得对吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-06 04:29:39

散列不保证插入顺序。你要求它散列你的密钥,所以x > y <=/=> f(x) > f(y)

如果您想要保证插入顺序,尽管我认为没有理由引入(tie的)开销,但一个标准方法是使用Tie::IxHash

列表有结尾,而不是散列。散列是从一组名称或ids到一组对象或值的数学映射。如果我们把狗的名字想成狗的名字,那么,尽管我们可以按字母顺序排列狗的名字,但真的没有“第一只狗”。

从你所展示的来看,

代码语言:javascript
复制
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]完全是一个单独的实体。

票数 1
EN

Stack Overflow用户

发布于 2012-04-06 04:52:35

如果需要有序项,请使用数组;如果需要命名(无序)项,请使用散列。要获得接近有序散列的内容,您需要嵌套数组/散列,或者对散列进行排序,或者使用一些绑定类。

嵌套

代码语言:javascript
复制
 @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"
    ]
};

排序

代码语言:javascript
复制
%funkce = ( ... ); # as in OP

# when using
foreach my $item (sort keys %funkce) {
  # do something with $funkce{$item}
}

并列

请参阅Tie::IxHash,但正如阿克斯曼所说,您可能不需要/不想要这个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10035480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档