2012-02-13 94 views
7

什么是最优雅的方式来把哈希里面出来?因此,我的意思是用值替换键,反之亦然(假设所有的值都是100%唯一的)。Whay是最优雅的方式来把哈希里面出来?

E.g.

开始

my %start = (1=>"a", 2=>"b", 3=>"c"); 

# ... 

# PROFIT: 
my %finish = ("c" => 3, "b" => 2, "a" => 1); 

我知道我能做到这一点的蛮力方式:

foreach my $key (keys %start) { 
    my $value = $start{$key}; 
    $finish{ $value } = $key; 
} 

但是这不能成为这样做的最佩尔利,优雅的方式!

+0

你暴力方法无法正常工作。你需要遍历'键%start'。 – cjm 2012-02-13 22:01:02

+2

“100%独特”是什么意思?你在做广告吗?有些东西可以“95%独特”吗?你是否告诉你的妻子她是你的“95%独特的爱”? – 2012-02-13 22:02:54

+0

@cjm - 你是对的。我编辑修复代码,并通过声明变量在最小范围内进行词法添加一些清理(换句话说,在所有地方都添加了“my”)。艾克 - 如果您不同意,可随时恢复编辑。 – DVK 2012-02-13 22:06:21

回答

15

reverse可能是最惯用的方式中:

my %finish = reverse %start; 

这工作,因为反向取%start哈希的形式(key1的值1键2值2 ... keyN值N)的列表;然后反转反转列表(valueN keyN ... value1 key1)。分配该列表的哈希变量,然后把它变成与奇数元素成为键和偶数元素成为价值

或者你可以使用map(那么优雅,但仍然惯用语)的哈希:

my %finish = map { ($start{$_} => $_) } keys %start; 
+3

'@finish {value%start} = keys%start'保留现有对。 – tchrist 2012-02-13 21:59:26

+1

'reverse%start'很聪明,但也许有点太聪明。 – cjm 2012-02-13 22:02:21

+0

@tchrist - 请你澄清一下吗? “保留现有对”是什么意思? – Ike 2012-02-13 22:02:51

10
my %start = (1=>"a", 2=>"b", 3=>"c"); 

my %finish; 
@finish{values %start} = keys %start; 
+0

上周,我花了半个[CENSORED]小时来解释Perl开始阶段的解决方案。我决定从材料中删除它。他们只是*不能理解哈希切片。他们陷入头脑中,“@”表示数组;他们不明白它需要'{'来表示散列,而'@'不重要。 – tchrist 2012-02-13 22:06:14

+1

虚拟+1(无法升级)一个聪明的解决方案。我不是一个完整的初学者,所以没有像上面的评论中的学生一样的问题:) – Ike 2012-02-13 22:08:54

+0

@ike - 你应该有足够的代表非虚拟现实。和我+1的一个伟大的习惯表达 – DVK 2012-02-14 12:24:35

相关问题