提问人:maciek 提问时间:5/30/2013 最后编辑:Brian Tompsett - 汤莱恩maciek 更新时间:10/22/2016 访问量:167
在 Perl 中创建哈希
Create a hash in Perl
问:
我有一个初学者问题:
我有一个@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);
答:
2赞
mpapec
5/30/2013
#1
使用哈希切片是用键/值填充哈希的最常见方法,
@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;
6赞
friedo
5/30/2013
#2
如果你只想创建两个哈希值,这真的很容易:
my ( %hash1, %hash2 );
@hash1{ @keys } = @value1;
@hash2{ @keys } = @value2;
这利用了哈希切片。
但是,制作一堆数字卡在末尾的新变量通常是一个错误。如果您希望将这些信息集中在一个结构中,则可以创建带有引用的嵌套哈希。
1赞
Miguel Prz
5/30/2013
#3
下面是一个示例:
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" },
#)
-1赞
isJustMe
5/30/2013
#4
这将完成:
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'
};
评论
2赞
amon
5/30/2013
这甚至不会编译在:没有引号。C型循环?明确?真?→ .好吧,至少你声明了你所有的变量......(我知道这个评论是不必要的尖刻,但这根本不是我想教的那种Perl)strict
a, b, c
scalar
for my $i (0 .. $#keys) {...}
0赞
isJustMe
5/30/2013
@amon没关系,任何反馈都很好,自从我上次使用 PERL 以来已经有 2 年了,无论如何,代码现在以 strict 运行,它可能不是很 perlish 或 oneliner,但它是另一种方法,以防你想在插入哈希之前操作值。
0赞
isJustMe
5/30/2013
有人愿意解释反对票吗?代码运行良好,并执行 OP 想要的操作
0赞
Jonathan Leffler
5/30/2013
剩余的反对投票可能是因为它使用了显式循环,其中切片是一种更简洁的表示法。
下一个:ADA:多项任务
评论