【问题标题】:Removing first key value pair from hash从哈希中删除第一个键值对
【发布时间】:2014-02-03 08:06:36
【问题描述】:

我有一个这样的哈希:

%hash = ('test' => 1,
     'test1' => 2,
     'test2' => 3,);

我想对这个散列进行排序并从散列中删除第一个键值对。如果我这样做, (排序键 %hash)[0],我可以访问第一个键。但是,如何删除该键值对?

如果我这样做

delete (sort keys %hash)[0]

Perl 抛出错误,

删除参数不是 HASH 或 ARRAY 元素

【问题讨论】:

  • 提供的两个答案 do 以某种稳定的方式排序,以便您可以将元素分类为“第一”,但它们不按字母顺序排序。它们按代码点顺序排序(我们过去称其为 ASCIIbetical 顺序,但在 Unicode 世界中不再适用)。要时刻铭记在心。 'Z' 排在 'a' 之前,所以 'Zoo' 将排在 'boo' 之前。

标签: perl


【解决方案1】:

表达式(sort keys %hash)[0] 返回一个字符串,因此您不能只将它传递给delete。您必须告诉 delete 您要从哪个哈希中删除。它应该是这样的:

delete $hash{(sort keys %hash)[0]};

【讨论】:

    【解决方案2】:

    首先,哈希没有“顺序”,但如果你想删除按字母顺序排在第一位的条目,你可以这样做:

    delete $hash{(sort keys %hash)[0]};
    

    【讨论】:

      【解决方案3】:

      如果您希望多次执行此操作,那么您应该保留一个已排序的哈希键数组。

      像这样

      use strict;
      use warnings;
      
      use Data::Dump;
      
      my %hash = (
        testA => 1,
        testB => 2,
        testC => 3
      );
      
      my @keys = sort keys %hash;
      
      dd \%hash;
      while (@keys) {
        delete $hash{shift @keys};
        dd \%hash;
      }
      

      输出

      { testA => 1, testB => 2, testC => 3 }
      { testB => 2, testC => 3 }
      { testC => 3 }
      {}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 2016-02-06
        • 1970-01-01
        相关资源
        最近更新 更多