如何在不使用临时数组的情况下访问最后一个Perl哈希键?

时间:2009-07-10 14:03:32

标签: perl hash

如何在不创建临时数组的情况下访问哈希中键的最后一个元素?

我知道哈希是无序的。但是,有一些应用程序(比如我的),我可以使用哈希键上的简单sort调用来订购我的密钥。希望我已经解释了为什么我想要这个。我承认,barney / elmo示例是一个糟糕的选择,但确实有它的应用程序。

请考虑以下事项:

my %hash = ( barney => 'dinosaur', elmo => 'monster' );
my @array = sort keys %hash;
print $array[$#{$hash}];
#prints "elmo"

关于如何在不调用temp的情况下执行此操作的任何想法(在这种情况下为@array)?

7 个答案:

答案 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)

哈希是无序的,因此没有“最后一个元素”这样的东西。迭代哈希(keysvalueseach)的函数有一个顺序,但它不是你应该依赖的任何东西。

从技术上讲,哈希有一个“哈希顺序”,这是迭代器使用的。散列顺序取决于散列算法,散列算法可以在不同版本的Perl之间更改(和拥有)。此外,从版本5.8.1开始,Perl包含散列随机化功能,可以更改散列算法以防止某些类型的攻击。<​​/ p>

一般来说,如果你关心订单,你应该使用数组。

答案 3 :(得分:1)

根据perldoc perldata

  

哈希是无序的集合   标量值由他们索引   相关的字符串键。

由于散列是无序的。非常抱歉。没有“最后”元素。

答案 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 /