如何重置perl中的哈希值
use warnings;
use strict;
my %hash = qw(one 1 two 2 three 3 four 4);
my @key = keys(%hash);
my @avz = (9..12);
my %vzm;
print "Original hash and keys : ",%hash,"\n";
for(my $i = 0; $i<=scalar @avz; $i++){
my @new = "$key[$i] $avz[$i] ";
push(%vzm , @new);
}
print "modified hash and keys",%vzm,"\n";
我试图用另一把键改变原始哈希的键。我该怎么做 这个程序给出的错误是:
Original hash and keys : three3one1two2four4
Not an ARRAY reference at key.pl line 10.
我希望输出
Original hash and keys : three3one1two2four4
modified hash and keys : three11one9two10four12
我该怎么做
答案 0 :(得分:2)
好的,先关闭 - 你在代码中做了一件令人讨厌的事情:
您正在尝试采用有序数据结构 - 数组 - 并将其推送到键控数据结构中,该数据结构没有定义特定的排序。
这不会很好 - 它在技术上有效,因为内部perl处理数组和哈希类似。
但是,例如你的第一个任务 - 你实际获得的是:
my %hash = (
one => 1,
two => 2,
three => 3,
four => 4
);
您可以通过keys()
访问密钥(无特定顺序)。价值来自values()
。但是尝试像对待数组一样对待它是未定义的行为。
要向数组添加元素:
$hash{'nine'} = 9;
要删除数组中的元素:
delete ( $hash{'one'} );
您可以在keys
或values
上进行迭代,并与sort
结合使用,甚至可以按某种顺序进行迭代。 (请记住,为了排序字母数字,您将拥有自定义排序作业)。
foreach my $key ( sort keys %hash ) {
print "$key => $hash{$key}\n";
}
(注意 - 这是按字母数字字符串排序,因此给出:
four => 4
one => 1
three => 3
two => 2
如果您想按值排序:
foreach my $key ( sort { $hash{$a} <=> $hash{$b} } keys %hash ) {
print "$key => $hash{$key}\n";
}
所以你会得到:
one => 1
two => 2
three => 3
four => 4
所以真正的问题仍然存在 - 你究竟想要完成什么?散列的 point 是为您提供一个无序的键值对迷你数据库。像阵列一样对待一个并不是很有意义。您要么以任意顺序迭代哈希元素,要么对它应用特定的排序 - 但是您依赖于以特定顺序获取元素的方法是一个糟糕的计划 - 它可能有用,但它不是保证工作,这会导致错误的代码。
答案 1 :(得分:1)
要创建哈希元素,请使用赋值给$var{$key}
。
for (my $i = 0; $i < scalar @avz; $i++) {
$vzm{$key[$i]} = $avz[$i];
}
另请注意,循环条件应为<
,而不是<=
。列表/数组索引以scalar @avz - 1
结束。
答案 2 :(得分:1)
您必须保持某些数组中键的顺序,或从原始列表中取出
my @tmp = qw(one 1 two 2 three 3 four 4);
my %hash = @tmp;
# 'one', 'two', ..
my @key = @tmp[ grep !($_%2), 0 .. $#tmp ];
# ..
for my $i (0 .. $#avz) {
$vzm{ $key[$i] } = $avz[$i];
}
或使用哈希切片作为更多perlish方法,
@vzm{ @key } = @avz;
答案 3 :(得分:1)
您无法执行您想要的操作(以最初添加的顺序替换散列中的键值),而无需单独跟踪该顺序,因为散列没有任何特定顺序。换句话说,这个:
my @key = keys(%hash);
需要这样:
my @key = ( 'one', 'two', 'three', 'four' );
完成后,您可以使用哈希切片一次性分配值:
my %vzm;
@vzm{@key} = @avz;