如何在 perl 中对哈希进行排序并将变量分配给数组中的密钥对?



我有一个这样的数组

my @arr =('1','apple','2','orange','1','orange','3','berry','2','berry','1','berry');
my %hash;
my $var =1;

现在如何对变量进行排序和分配? 所需的输出为

$hash{1}{apple} =>1;
$hash{1}{orange} =>1;
$hash{1}{berry} =>1;
$hash{2}{orange} =>1;
$hash{2}{berry} =>1;
$hash{3}{berry} =>1;  

您需要迭代数组并在每次迭代中取出两个值。一种方法是使用 while 循环。这将消耗数组,因此如果要保留它,则可能需要创建副本。

use strict;
use warnings;
use Data::Printer;
my @arr = (
'1', 'apple', '2', 'orange', '1', 'orange',
'3', 'berry', '2', 'berry',  '1', 'berry',
);
my %hash;
my $var = 1;
while ( my $first_key = shift @arr ) {
my $second_key = shift @arr;
$hash{$first_key}->{$second_key} = $var;
}
p %hash;

这输出

{
1   {
apple    1,
berry    1,
orange   1
},
2   {
berry    1,
orange   1
},
3   {
berry   1
}
}

另一种方法是使用 C 样式的for循环。这不会更改数组。

for (my $i = 0; $i <= $#arr; $i+=2) {
$hash{ $arr[$i] }->{ $arr[$i + 1] } = $var;
}

或者你可以使用List::Util的pairs函数同时取出两个。

use List::Util 'pairs';
foreach my $pair ( pairs @arr ) {
my ( $first_key, $second_key ) = @$pair;
$hash{$first_key}->{$second_key} = $var;
}

通常期望您至少花几个小时尝试自己编写解决方案。如果您自己做了一次不错的尝试,但已经没有想法,我们将很乐意为您提供帮助,但如果您似乎将问题倾倒在我们身上,并且在喝一杯咖啡时等待答案弹出,那就不好了。你之前被告知过这件事,你的帖子中只有一个有净赞成票。你需要为此努力。

你确定你真的想要一个哈希哈希吗?这很容易让人想起你之前的问题如何在不使用 perl 中的键的情况下查找哈希中是否存在该值?我们几乎确定这是错误的选择。

唯一不明显的部分是成对从数组中提取值,我和我使用 C 风格的for循环来实现这一点。

我只使用Data::Dumper来显示哈希的结果哈希。

use strict;
use warnings 'all';
my @arr = qw/ 1 apple 2 orange 1 orange 3 berry 2 berry 1 berry /;
my %hash;
for ( my $i = 0; $i < $#arr; $i += 2 ) {
$hash{$arr[$i]}{$arr[$i+1]} = 1;
}
use Data::Dumper;
print Dumper %hash;

输出

$VAR1 = {
'2' => {
'berry' => 1,
'orange' => 1
},
'3' => {
'berry' => 1
},
'1' => {
'berry' => 1,
'orange' => 1,
'apple' => 1
}
};

更新

下面是我在注释中描述的生成密钥的示例。它与上面的解决方案几乎相同,但生成的哈希内容不同。

use strict;
use warnings 'all';
my @arr = qw/ 1 apple 2 orange 1 orange 3 berry 2 berry 1 berry /;
my %hash;
for ( my $i = 0; $i < $#arr; $i += 2 ) {
$hash{"@arr[$i,$i+1]"} = 1;
}
use Data::Dumper;
print Dumper %hash;

输出

$VAR1 = {
'2 berry' => 1,
'1 apple' => 1,
'3 berry' => 1,
'1 orange' => 1,
'1 berry' => 1,
'2 orange' => 1
};

一次从数组中获取两个值(键/值(,将它们放入哈希中,然后将变量作为值分配。

use Data::Dumper;
sub SortAndAssign {
my ($args) = @_;
my @arr = @{$args->{ARRAY}};
my $var = $args->{VARIABLE};
my %hash;
my $i = 0;
my $size = scalar(@arr);
while ($i < $size) {
# alternating key/value pairs (really a hash)
my $key = $arr[$i++];   # e.g. 1
my $value = $arr[$i++]; # e.g. apple
$hash{$key}{$value} = $var; # e.g. hash->1->apple = 1
}
return %hash;
}
sub ShowSortAndAssign {
my @arr =('1','apple','2','orange','1','orange','3','berry','2','berry','1','berry');
my $var = 1;
my %hash = SortAndAssign({
ARRAY => @arr,
VARIABLE => $var,
});
print Dumper(%hash);
print "first apple is " . $hash{1}{apple};
}
sub _Main {
ShowSortAndAssign();
}
_Main();

最新更新