2

我有一个这样的哈希:

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

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

如果我做

delete (sort keys %hash)[0]

Perl 抛出一个错误,

删除参数不是 HASH 或 ARRAY 元素

4

3 回答 3

12

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

delete $hash{(sort keys %hash)[0]};
于 2012-07-26T04:17:51.413 回答
4

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

delete $hash{(sort keys %hash)[0]};
于 2012-07-26T04:17:48.013 回答
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 }
{}
于 2012-07-26T08:18:18.683 回答