代码之家  ›  专栏  ›  技术社区  ›  Zaid

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

  •  4
  • Zaid  · 技术社区  · 15 年前

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

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

    考虑以下事项:

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

    关于如何在不调用temp(@array,在本例中)的情况下执行此操作有什么想法吗?

    7 回复  |  直到 10 年前
        1
  •  11
  •   friedo    15 年前
    print( (keys %hash)[-1]);
    

    注意,额外的parens是必要的,以防止语法混淆 print 的PARAM列表。

    您还可以使用这个邪恶的技巧强制它进入标量上下文,并去掉多余的parens:

    print ~~(keys %hash)[-1];
    
        2
  •  4
  •   user80168    15 年前

    一般来说,假设您想要最后一个,按字母顺序排序,这很简单:

    use List::Util qw( maxstr );
    
    print maxstr(keys %hash);
    

    如果您不喜欢使用模块(我看不出这是什么原因,但有些人喜欢让模块更难使用):

    print( (sort keys %hash)[-1] );
    
        3
  •  2
  •   Michael Carman    15 年前

    散列是无序的,所以没有“最后一个元素”这样的东西。用于迭代散列的函数( keys , values each )有一个命令,但这不是你应该依赖的任何东西。

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

    一般来说,如果您关心顺序,那么应该使用数组。

        4
  •  1
  •   J-16 SDiZ    15 年前

    根据 perldoc perldata :

    哈希是无序的 按其索引的标量值 关联的字符串键。

    因为散列是无序的。所以,对不起。没有“last”元素。

        5
  •  1
  •   brian d foy JRFerguson    15 年前

    为了让其他人的观点更清楚,每次调用键、值或在同一进程的生命周期内调用每个值时,Perl中的哈希键的顺序都是相同的,前提是哈希没有被修改。从 perlfunc :

    钥匙以明显随机的顺序返回。在Perl的未来版本中,实际的随机顺序可能会发生变化,但它保证与值或每个函数产生的顺序相同(假定哈希没有被修改)。由于Perl5.8.1,出于安全原因,即使在不同运行的Perl之间,顺序也不同(请参见Perlsec中的“算法复杂性攻击”)。

        6
  •  0
  •   Lennotoecom    10 年前
    $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";
    

    ! 但要小心,因为有明显的原因

        7
  •  -1
  •   joe    15 年前

    哈希是无序元素。所以可能是你的哈希最后一个元素是elmo/