我有一些哈希问题。
如果我有一个哈希包含,约翰,约翰,约翰,鲍勃,鲍勃,保罗 - 那么一个函数可以只返回:
John,Bob,Paul。
换句话说,我想获得所有不同的值(或者如果值不可能,则为键) - 但只有一次:)。
我希望你明白我的问题,thx:)
答案 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
可以是任何字符串列表,例如一个或多个数组,子例程调用等等。