要散列的 Perl 数组数字
Perl array numbers to hash
在 Perl 中,我有一个数组
my @array = (1 3 6 12);
从上面的数组中,我想要从一个值映射到下一个值的哈希并继续。
我想要这样输出。最后一个数字应该映射到它自己的
$VAR1 = {,
'1' => '3',
'3' => '6',
'6' => '12',
'12' => '12'
};
这是我尝试从 Perl 中的数组中获取散列的代码
use strict;
use warnings;
use Data::Dumper qw(Dumper);
my @array = qw(1 3 6 12);
my %hash = @array;
print Dumper \%hash;
我得到的输出为:
$VAR1 = {
'6' => '12',
'1' => '3'
};
我是 Perl 初学者,有人可以帮忙吗?
提前致谢
您可以将数组直接分配给散列以获得一半的对。使用数组切片获取另一半。
my %hash = (@values, @values[1 .. $#values, $#values]);
这不适用于具有奇数个元素的数组,但不清楚在这种情况下您期望得到什么输出。此外,不清楚如何处理重复元素。
遍历数组的常用方法是使用 for
循环遍历数组的元素。
for (@values) {
say $_;
}
但在这种情况下,我们需要数组中的每个元素以及数组中的 next 元素。所以遍历数组的 indexes 会更方便。我们使用特殊变量 $#values
为我们提供数组中的最终索引。
for (0 .. $#values) {
say "The value at index $_ is $values[$_]"
}
然后我们也可以获得下一个元素:
for (0 .. $#values) {
say "$values[$_] => $values[$_ + 1]"
}
运行 让我们接近我们想要的数据:
1 => 3
3 => 6
6 => 12
Use of uninitialized value in concatenation (.) or string at array2hash line 10.
12 =>
但是因为 12 是数组中的最后一个元素,所以获取下一个元素没有任何意义(Perl 给了我们 undef
值——因此警告)。
在您的示例中,您似乎希望最终元素指向自身。我们可以使用“定义或”运算符 (//
) 来处理:
for (0 .. $#values) {
say "$values[$_] => ", $values[$_ + 1] // $values[$_];
}
现在剩下的就是将所需数据存储在散列中:
my %values_hash;
for (0 .. $#values) {
$values_hash{$values[$_]} = $values[$_ + 1] // $values[$_];
}
使用 Data::Dumper 检查我们的散列,我们得到:
$VAR1 = {
'3' => 6,
'12' => 12,
'6' => 12,
'1' => 3
};
这就是我们想要的(考虑到哈希是无序的)。
Perl 专家可能会将其重写为:
my %values_hash = map {
$values[$_] => $values[$_ + 1] // $values[$_]
} 0 .. $#values;
更新:另一种方法是使用哈希切片。
my %values_hash;
@values_hash{@values} = @values[1 .. $#values, $#values];
遍历数组并将每个元素用作键,将下一个元素用作值,除非您在最后一个元素处:
foreach $x(0..$#array) {
($x == $#array) ? ($hash{$array[$x]} = $array[$x]) : ($hash{$array[$x]} = $array[$x+1]);
}
foreach $y (sort {$a<=>$b} keys %hash) {
print "$y => $hash{$y}\n";
}
在 Perl 中,我有一个数组
my @array = (1 3 6 12);
从上面的数组中,我想要从一个值映射到下一个值的哈希并继续。
我想要这样输出。最后一个数字应该映射到它自己的
$VAR1 = {,
'1' => '3',
'3' => '6',
'6' => '12',
'12' => '12'
};
这是我尝试从 Perl 中的数组中获取散列的代码
use strict;
use warnings;
use Data::Dumper qw(Dumper);
my @array = qw(1 3 6 12);
my %hash = @array;
print Dumper \%hash;
我得到的输出为:
$VAR1 = {
'6' => '12',
'1' => '3'
};
我是 Perl 初学者,有人可以帮忙吗?
提前致谢
您可以将数组直接分配给散列以获得一半的对。使用数组切片获取另一半。
my %hash = (@values, @values[1 .. $#values, $#values]);
这不适用于具有奇数个元素的数组,但不清楚在这种情况下您期望得到什么输出。此外,不清楚如何处理重复元素。
遍历数组的常用方法是使用 for
循环遍历数组的元素。
for (@values) {
say $_;
}
但在这种情况下,我们需要数组中的每个元素以及数组中的 next 元素。所以遍历数组的 indexes 会更方便。我们使用特殊变量 $#values
为我们提供数组中的最终索引。
for (0 .. $#values) {
say "The value at index $_ is $values[$_]"
}
然后我们也可以获得下一个元素:
for (0 .. $#values) {
say "$values[$_] => $values[$_ + 1]"
}
运行 让我们接近我们想要的数据:
1 => 3
3 => 6
6 => 12
Use of uninitialized value in concatenation (.) or string at array2hash line 10.
12 =>
但是因为 12 是数组中的最后一个元素,所以获取下一个元素没有任何意义(Perl 给了我们 undef
值——因此警告)。
在您的示例中,您似乎希望最终元素指向自身。我们可以使用“定义或”运算符 (//
) 来处理:
for (0 .. $#values) {
say "$values[$_] => ", $values[$_ + 1] // $values[$_];
}
现在剩下的就是将所需数据存储在散列中:
my %values_hash;
for (0 .. $#values) {
$values_hash{$values[$_]} = $values[$_ + 1] // $values[$_];
}
使用 Data::Dumper 检查我们的散列,我们得到:
$VAR1 = {
'3' => 6,
'12' => 12,
'6' => 12,
'1' => 3
};
这就是我们想要的(考虑到哈希是无序的)。
Perl 专家可能会将其重写为:
my %values_hash = map {
$values[$_] => $values[$_ + 1] // $values[$_]
} 0 .. $#values;
更新:另一种方法是使用哈希切片。
my %values_hash;
@values_hash{@values} = @values[1 .. $#values, $#values];
遍历数组并将每个元素用作键,将下一个元素用作值,除非您在最后一个元素处:
foreach $x(0..$#array) {
($x == $#array) ? ($hash{$array[$x]} = $array[$x]) : ($hash{$array[$x]} = $array[$x+1]);
}
foreach $y (sort {$a<=>$b} keys %hash) {
print "$y => $hash{$y}\n";
}