如何在Perl中的哈希中获取所有不同的值(或键)

时间:2012-05-29 08:21:32

标签: perl hash key

我有一些哈希问题。

如果我有一个哈希包含,约翰,约翰,约翰,鲍勃,鲍勃,保罗 - 那么一个函数可以只返回:

John,Bob,Paul。

换句话说,我想获得所有不同的值(或者如果值不可能,则为键) - 但只有一次:)。

我希望你明白我的问题,thx:)

3 个答案:

答案 0 :(得分:3)

TIMTOWTDI:

my @unique = keys { reverse %hash };

请注意reverse的性能警告:


  

这个运算符对于反转哈希也很方便,尽管有   一些警告。如果原始哈希中的值重复,则只有一个值   其中的那些可以表示为反向散列中的键。还有,这个   必须解开一个哈希并构建一个全新的哈希,这可能需要一些   在大型哈希上的时间,例如来自DBM文件。

%by_name = reverse %by_address;  # Invert the hash

答案 1 :(得分:2)

这样的事可能会对你有所帮助:

use List::MoreUtils qw{ uniq };

my %hash = ( a => 'Paul', b => 'Paul', c => 'Peter' );
my @uniq_names = uniq values %hash;
print "@uniq_names\n";

钥匙永远是唯一的。

答案 2 :(得分:2)

使用哈希值轻松(和惯用)完成重复数据删除:

my @uniq = keys { map { $_ => 1 } values %hash };

一种简单的方法,不需要安装模块。由于散列键必须是唯一的,因此当在同一散列中用作键时,任何字符串列表都会自动被删除。

请注意在{ ... }语句周围使用大括号形成匿名哈希map。这是keys所必需的。

另请注意,values %hash可以是任何字符串列表,例如一个或多个数组,子例程调用等等。