我对一些哈希有一点问题。
如果我有一个包含 John,John,John,Bob,Bob,Paul 的散列 - 是否有一个函数可以只返回:
约翰、鲍勃、保罗。
换句话说,我想获得所有不同的值(如果值不可能,则为键)-但只有一次:)。
我希望你能理解我的问题,谢谢 :)
蒂姆托迪:
my @unique = keys { reverse %hash };
请注意性能警告reverse
:
尽管有一些注意事项,但该运算符对于反转哈希也很方便。如果一个值在原始散列中重复,则只有其中一个可以表示为反向散列中的键。此外,这必须展开一个散列并构建一个全新的散列,这可能需要一些时间来处理大型散列,例如来自 DBM 文件的散列。
%by_name = reverse %by_address; # Invert the hash
通过使用哈希可以轻松(并且习惯性地)完成重复数据删除:
my @uniq = keys { map { $_ => 1 } values %hash };
一种不需要安装模块的简单方法。由于散列键必须是唯一的,因此任何字符串列表在用作同一散列中的键时都会自动进行重复数据删除。
请注意使用花括号在语句{ ... }
周围形成匿名散列。map
这是keys
.
另请注意,它values %hash
可以是任何字符串列表,例如一个或多个数组、子程序调用等等。
这样的事情可能会帮助你:
use List::MoreUtils qw{ uniq };
my %hash = ( a => 'Paul', b => 'Paul', c => 'Peter' );
my @uniq_names = uniq values %hash;
print "@uniq_names\n";
键总是唯一的。