如何使用perl中的新值更改哈希值?

时间:2014-11-27 16:37:15

标签: perl data-structures hash

如何重置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

我该怎么做

4 个答案:

答案 0 :(得分:2)

好的,先关闭 - 你在代码中做了一件令人讨厌的事情:

您正在尝试采用有序数据结构 - 数组 - 并将其推送到键控数据结构中,该数据结构没有定义特定的排序。

这不会很好 - 它在技术上有效,因为内部perl处理数组和哈希类似。

但是,例如你的第一个任务 - 你实际获得的是:

my %hash = (
    one   => 1,
    two   => 2,
    three => 3,
    four  => 4
);

您可以通过keys()访问密钥(无特定顺序)。价值来自values()。但是尝试像对待数组一样对待它是未定义的行为。

要向数组添加元素:

$hash{'nine'} = 9;

要删除数组中的元素:

delete ( $hash{'one'} ); 

您可以在keysvalues上进行迭代,并与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;