4

我有一个初学者问题:

我有一个@key_table 和许多@values_tables。我想创建一个对散列的引用的@table,所以有一个表,每个元素都指向散列,其中键和值来自开头显示的 2 个表。

有人可以帮我吗?

例如:

@keys = (Kate, Peter, John);
@value1 = (1, 2, 3);
@value2 = (a, b, c);

我想要一个两元素表,它指向:

%hash1 = (Kate=>1, Peter=>2, John=>3);
%hash2 = (Kate=>a, Peter=>b, John=>c);
4

4 回答 4

6

如果您只想创建两个哈希,那真的很容易:

my ( %hash1, %hash2 );
@hash1{ @keys } = @value1;
@hash2{ @keys } = @value2;

这利用了散列

但是,创建一堆新的变量并且数字卡在末尾通常是错误的。如果您希望将这些信息全部放在一个结构中,您可以创建带有引用的嵌套散列。

于 2013-05-29T17:18:29.500 回答
2

使用散列切片是使用键/值填充散列的最常用方法,

 @hash1{@keys} = @value1;
 @hash2{@keys} = @value2;

但它可以使用 ie 以其他(效率较低的)方式完成。map,

my %hash1 = map { $keys[$_] => $value1[$_] } 0 .. $#keys;
my %hash2 = map { $keys[$_] => $value2[$_] } 0 .. $#keys;

甚至foreach

$hash1{ $keys[$_] } = $value1[$_] for 0 .. $#keys;
$hash2{ $keys[$_] } = $value2[$_] for 0 .. $#keys;
于 2013-05-29T17:17:02.150 回答
1

这是一个例子:

use strict;
use warnings;
use Data::Dump;

#Example data
my @key_table = qw/Kate Peter John/;
my @values_tables = (
   [qw/1 2 3/],
   [qw/a b c/]
);

my @table;
for my $vt(@values_tables) {
    my %temph;
    @temph{ @key_table } = @$vt;
    push @table, \%temph;
}

dd(@table);
#<--- prints:
#(
#  { John => 3, Kate => 1, Peter => 2 },
#  { John => "c", Kate => "a", Peter => "b" },
#)
于 2013-05-29T17:32:52.860 回答
-1

这将做到:

   use Data::Dumper;
use strict;

my @keys = ("Kate", "Peter", "John");
my @value1 = (1, 2, 3);
my @value2 = ("a", "b", "c");
my (%hash1,%hash2);


for my $i (0 .. $#keys){
    $hash1{$keys[$i]}=$value1[$i];
    $hash2{$keys[$i]}=$value2[$i];
}

print Dumper(\%hash1);

print Dumper(\%hash2);

这是输出:

$VAR1 = {
          'John' => 3,
          'Kate' => 1,
          'Peter' => 2
        };
$VAR1 = {
          'John' => 'c',
          'Kate' => 'a',
          'Peter' => 'b'
        };
于 2013-05-29T17:43:33.560 回答