0

次のように、ハッシュのハッシュにハッシュを追加しようとしています。

  %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"
        ]
    };

しかし問題がある。最後の 1 つのハッシュは %function の最初に追加されますが、最後のハッシュとして追加します。どうすれば修正できますか?そして、私はそれを正しくやっていますか?ありがとう

4

2 に答える 2

1

ハッシュは挿入順序を保証しません。キーをハッシュするように求めているので、x > y <=/=> f(x) > f(y)

挿入順序を保証したい場合、( a のtie)オーバーヘッドを導入する理由はわかりませんが、標準的な方法は を使用することTie::IxHashです。

リストにはハッシュではなくエンドがあります。ハッシュは、一連の名前または ID から一連のオブジェクトまたは値への数学的なマッピングです。犬に犬の名前を考えてみると、犬の名前をアルファベット順に並べることはできますが、実際には「最初の犬」はありません。

見せていただいたものから、

push( @funkce
    , { "file"    => "soubor1"
      , "name"    => "jmeno1"
      , "varargs" => "args"
      , "rettype" => "navrat"
      , "params"  => [ qw<typ typ2> ]
      });

同じようにうまくいきます。orを入力する$funkce{'funcke2'}よりも入力するメリットはほとんどありませ ん。他の名前をインクリメントする場合は、次のように分割する必要があります。$funkce[2]$funkce{ '$funkce' . $i }$funkce[$i] $funkce{'funkce'}[2] // $funkce{'superfunkce'}[2]

名前の個々の部分にハッシュを使用し、数値に配列を使用することは、データをプログラミングするのに適した方法です。$funkce{'funkce'}[2]としての特異なエンティティ$funkce{'funkce2'}です。

于 2012-04-05T20:29:38.803 に答える
0

順序付けされたアイテムが必要な場合は配列を使用し、名前付き (順序付けされていない) アイテムが必要な場合はハッシュを使用します。順序付けられたハッシュに近いものを取得するには、ネストされた配列/ハッシュを使用するか、ハッシュを並べ替えるか、関連付けられたクラスを使用する必要があります。

ネスティング

 @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}
}

結ばれた

しかし、 AxemanTie::IxHashが言ったように、おそらくこれは必要ない/したくないでしょう。

于 2012-04-05T20:52:35.097 に答える