在Perl中,如何使用专用子例程按其值对词法哈希进行排序?

new*_*erl 2 sorting perl

这有效:

my %score = ( a => 1, b => 2);
@keys = sort {$score{$a} <=> $score{$b}} keys %score;
Run Code Online (Sandbox Code Playgroud)

但是如何将代码放入{..}专用子例程中?

sub by_num {
  $score{$a} <=> $score{$b}
}

@keys = sort by_num keys %score;
Run Code Online (Sandbox Code Playgroud)

Cha*_*ens 5

这里的主要问题是有一个可以访问哈希的子程序.您要么必须为要排序的每个哈希创建一个函数:

#!/usr/bin/perl

use strict;
use warnings;

{
    my %hash = (
        a => 1,
        b => 2,
        c => 3,
    );

    sub sort_hash_a {
        return $hash{$a} <=> $hash{$b};
    }

    for my $k (sort sort_hash_a keys %hash) {
        print "$k\n";
    }
}

{
    my %hash = (
        x => 1,
        y => 2,
        z => 3,
    );

    sub sort_hash_b {
        return $hash{$a} <=> $hash{$b};
    }

    for my $k (sort sort_hash_b keys %hash) {
        print "$k\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

或者创建一个为您创建函数的高阶函数:

#!/usr/bin/perl

use strict;
use warnings;

sub make_hash_sort {
    my $hashref = shift;

    return sub {
        return $hashref->{$a} <=> $hashref->{$b};
    };
}

my %hash = (
    one   => 1,
    two   => 2,
    three => 3,
);

my $sub = make_hash_sort \%hash;

for my $k (sort $sub keys %hash) {
    print "$k\n";
}
Run Code Online (Sandbox Code Playgroud)

但所有这一切通常都是程序员和计算机的浪费.几乎在所有情况下,块语法都更快,更容易使用.唯一的例外是复杂的排序或高度重复的代码.