>我有一个排序的哈希,我正在将其转换为两个单独的数组,一个带有键,一个带有值,如何在转换过程中保持数组像哈希一样排序?我希望能够使用例如 array1[0] 和 array2[0],知道它们是哈希中的键/值对。这就是我转换我的哈希值的方式:
my @array1 = keys %hash;
my @array2 = values %hash;
现在,array1 和 array2 的元素显示信息的顺序与打印出排序的键/值的顺序不同。有没有办法按值以与哈希相同的方式对数组进行排序?
如果我理解正确,您希望两个数组都按哈希值排序。
按值对第二个数组的索引进行排序,然后使用生成的索引列表对第一个数组进行切片:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my %hash = ( eight => 8,
five => 5,
four => 4,
nine => 9,
one => 1,
seven => 7,
six => 6,
ten => 10,
three => 3,
two => 2,
);
my @array1 = keys %hash;
my @array2 = values %hash;
my @indices = sort { $array2[$a] <=> $array2[$b] } 0 .. $#array2;
@array1 = @array1[@indices];
@array2 = @array2[@indices];
say "@array1n@array2";
或者,按值对键进行排序,然后将哈希映射到键以获取值:
my @array1 = sort { $hash{$a} <=> $hash{$b} } keys %hash;
my @array2 = map $hash{$_}, @array1;
如果要按字母顺序而不是按数字顺序对值进行排序,请使用 cmp
而不是 <=>
。
我有一个排序的哈希
不,你没有。哈希本质上是未排序的,并且是故意的。你没有展示你做了什么让你认为你已经"排序"了你的哈希值,但我保证这是不可能的。你可以写
sort %hash
但这根本不会有任何用处,当然也不会改变哈希的内容。
唯一可以保证的是,keys
和 values
将以相同的顺序返回每个元素的这些部分
如果您解释您的目标,那么我们将能够更好地提供帮助
我希望能够使用例如 array1[0] 和 array2[0],知道它们是哈希中的键/值对
无论如何,你可以这样做。只要您在程序中的同一点使用 keys
和 values
,并且哈希在两者之间没有被修改,那么$hash{$keys[0]}
就可以保证$values[0]
如果您需要按特定顺序检索哈希的内容,那么您必须描述您的目的并更好地说明您的需求