如何在不创建临时数组的情况下访问哈希中键的最后一个元素?
我知道哈希是无序的。但是,有一些应用程序(比如我的),我可以使用哈希键上的简单sort
调用来订购我的密钥。希望我已经解释了为什么我想要这个。我承认,barney / elmo示例是一个糟糕的选择,但确实有它的应用程序。
请考虑以下事项:
my %hash = ( barney => 'dinosaur', elmo => 'monster' );
my @array = sort keys %hash;
print $array[$#{$hash}];
#prints "elmo"
关于如何在不调用temp的情况下执行此操作的任何想法(在这种情况下为@array)?
答案 0 :(得分:11)
print( (keys %hash)[-1]);
请注意,为防止语法与print
的参数列表混淆,必须使用额外的parens。
你也可以使用这个邪恶的技巧强制它进入标量上下文并消除额外的parens:
print ~~(keys %hash)[-1];
答案 1 :(得分:4)
通常,假设您想要最后一个,按字母顺序排序,这很简单:
use List::Util qw( maxstr );
print maxstr(keys %hash);
如果你不想使用模块(我认为没有合理的理由,但有些人喜欢让模块变得更难):
print( (sort keys %hash)[-1] );
答案 2 :(得分:2)
哈希是无序的,因此没有“最后一个元素”这样的东西。迭代哈希(keys
,values
和each
)的函数有一个顺序,但它不是你应该依赖的任何东西。
从技术上讲,哈希有一个“哈希顺序”,这是迭代器使用的。散列顺序取决于散列算法,散列算法可以在不同版本的Perl之间更改(和拥有)。此外,从版本5.8.1开始,Perl包含散列随机化功能,可以更改散列算法以防止某些类型的攻击。</ p>
一般来说,如果你关心订单,你应该使用数组。
答案 3 :(得分:1)
答案 4 :(得分:1)
为了让其他人更清楚,每次调用密钥,值或每个在同一进程的生命周期内时,Perl中的哈希密钥将具有相同的顺序,假设哈希未被修改。来自perlfunc:
键以明显随机的顺序返回。实际的随机顺序在将来的perl版本中可能会发生变化,但保证与值或每个函数产生的顺序相同(假设散列未被修改)。从Perl 5.8.1开始,出于安全原因,即使在不同的Perl运行之间,顺序也是不同的(参见perlsec中的“算法复杂性攻击”)。
答案 5 :(得分:0)
$h{'11c'} = 'C';
$h{'b'} = 'B';
$h{'e22'} = 'E';
$h{'aaaaa'} = 'AAAA';
for (keys %h){
$a = \$h{$_} and $b = $_ if $a < \$h{$_};
}
print "$b\n";
<强>! 但由于显而易见的原因,请小心
答案 6 :(得分:-1)
哈希是无序元素。所以你的哈希最后一个元素可能是elmo /