我有一个已排序的哈希,我将转换为两个独立的数组,一个包含键,一个值,如何通过转换过程保持数组像哈希一样排序?我希望能够使用例如array1 [0]和array2 [0]知道它们是散列中的键/值对。这是我转换哈希的方式:
my @array1 = keys %hash;
my @array2 = values %hash;
现在是array1&的元素array2不会以打印排序的键/值的相同顺序显示信息。有没有办法按照与值哈希相同的方式对数组进行排序?
答案 0 :(得分:1)
如果我理解正确,您希望两个数组都按哈希值排序。
按值对第二个数组的索引进行排序,然后使用结果索引列表对第一个数组进行切片:
#!/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 "@array1\n@array2";
或者,按值对键进行排序,然后将哈希映射到键以获取值:
my @array1 = sort { $hash{$a} <=> $hash{$b} } keys %hash;
my @array2 = map $hash{$_}, @array1;
如果您想按字母顺序而不是按字母顺序对值进行排序,请使用cmp
代替<=>
。
答案 1 :(得分:1)
不,你不是。哈希本质上是未分类的,故意如此。你没有表现出你所做的事情,这让你认为自己已经完成了排序&#34;你的哈希,但我保证这是不可能的。你可以写我有一个排序哈希
sort %hash
但这根本不会有用,肯定不会改变哈希的内容
所有保证的是keys
和values
将以相同的顺序返回每个元素的那些部分
如果你解释了你的目标,那么我们将能够提供更好的帮助
我希望能够使用例如array1 [0]和array2 [0]知道它们是散列中的键/值对
无论如何你都可以这样做。只要您在程序中的同一点使用keys
和values
,并且哈希值不会在其间进行修改,那么$hash{$keys[0]}
将保证为{{1} }}
如果您需要按特定顺序检索哈希的内容,那么您必须描述您的目的并更好地说出您需要的内容