line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Sort::Hash::Values; |
2
|
|
|
|
|
|
|
{ |
3
|
|
|
|
|
|
|
$Sort::Hash::Values::VERSION = '0.1.1'; |
4
|
|
|
|
|
|
|
} |
5
|
1
|
|
|
1
|
|
3215455
|
use strict; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
34
|
|
6
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
37
|
|
7
|
1
|
|
|
1
|
|
5
|
use Exporter 5.59 qw/import/; |
|
1
|
|
|
|
|
31
|
|
|
1
|
|
|
|
|
162
|
|
8
|
|
|
|
|
|
|
our @EXPORT = our @EXPORT_OK = qw/sort_values/; |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
# Returns keys of sorted hash values |
11
|
|
|
|
|
|
|
sub sort_values(&@) { |
12
|
4
|
|
|
4
|
1
|
976
|
my ($code, %hash) = @_; |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
# Perl has special behavior when code prototype is $$ of uploading |
15
|
|
|
|
|
|
|
# sorted values to @_. || "" is needed to avoid undef warning. |
16
|
4
|
50
|
50
|
|
|
26
|
if ((prototype $code || "") eq '$$') { |
17
|
0
|
|
|
|
|
0
|
my $old_code = $code; |
18
|
|
|
|
|
|
|
$code = sub { |
19
|
0
|
|
|
0
|
|
0
|
$old_code->($a, $b); |
20
|
|
|
|
|
|
|
} |
21
|
0
|
|
|
|
|
0
|
} |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
# I need caller, so the package to modify would be known. |
24
|
4
|
|
|
|
|
8
|
my $pkg = caller; |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# I need this sub {} because for some reason I'm not allowed to use |
27
|
|
|
|
|
|
|
# lexical pragmas in sort block. |
28
|
|
|
|
|
|
|
my $by_values = sub { |
29
|
|
|
|
|
|
|
# As I'm doing direct symbol table modifications, disable |
30
|
|
|
|
|
|
|
# strict 'refs' for this subroutine. |
31
|
1
|
|
|
1
|
|
5
|
no strict 'refs'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
410
|
|
32
|
|
|
|
|
|
|
# Localize $a and $b in caller package |
33
|
18
|
|
|
18
|
|
182
|
local *{"${pkg}::a"} = \$a->[1]; |
|
18
|
|
|
|
|
31
|
|
34
|
18
|
|
|
|
|
19
|
local *{"${pkg}::b"} = \$b->[1]; |
|
18
|
|
|
|
|
25
|
|
35
|
18
|
|
|
|
|
34
|
$code->(); |
36
|
4
|
|
|
|
|
17
|
}; |
37
|
4
|
|
|
|
|
42
|
map $_->[0], sort $by_values map [$_ => $hash{$_}], keys %hash; |
38
|
|
|
|
|
|
|
} |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
# Positive value at end |
41
|
|
|
|
|
|
|
1; |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=head1 NAME |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
Sort::Hash::Values - sort hashes by values |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
=head1 SYNOPSIS |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
use Sort::Hash::Values; |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
my %birth_dates = ( |
52
|
|
|
|
|
|
|
Larry => 1954, |
53
|
|
|
|
|
|
|
Randal => 1961, |
54
|
|
|
|
|
|
|
Damian => 1964, |
55
|
|
|
|
|
|
|
Simon => 1978, |
56
|
|
|
|
|
|
|
Mark => 1965, |
57
|
|
|
|
|
|
|
Jesse => 1976, |
58
|
|
|
|
|
|
|
); |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
for my $name (sort_values { $a <=> $b } %birth_dates) { |
61
|
|
|
|
|
|
|
printf "%7s was born in %s.\n", $name, $birth_dates{$name}; |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=head1 DESCRIPTION |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
C is a function that returns keys of values after |
67
|
|
|
|
|
|
|
sorting its values. |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=head1 EXPORTS |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
All functions are exported using L. If you don't want this |
72
|
|
|
|
|
|
|
(but why you would use this module then) try importing it using empty |
73
|
|
|
|
|
|
|
list of functions. |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
use Sort::Hash::Values (); |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
=over 4 |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
=item sort_values { code } %hash |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
The only function in this module. It sorts every value in hash using |
82
|
|
|
|
|
|
|
specified code and returns list of their keys sorted according to their |
83
|
|
|
|
|
|
|
values. |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
Just like with C in Perl, when code prototype is C<$$>, the |
86
|
|
|
|
|
|
|
variables to sort will be in C<@_> too. |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
=back |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
=head1 CAVEATS |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
When giving the function to C it has to be function in |
93
|
|
|
|
|
|
|
scope where you call C. This is internal limitation caused |
94
|
|
|
|
|
|
|
by the fact that Perl module cannot know what package the function you |
95
|
|
|
|
|
|
|
used belongs. It can only know where C was called. This |
96
|
|
|
|
|
|
|
bug also affects C in L, C in |
97
|
|
|
|
|
|
|
L and other functions that use C<$a> or C<$b> |
98
|
|
|
|
|
|
|
variables - those variables have to be modified in function's package. |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
The code block isn't optional. I really would like to make it optional, |
101
|
|
|
|
|
|
|
but I cannot with Perl limitations. Instead, use C<{ $a cmp $b }> just |
102
|
|
|
|
|
|
|
after C. |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
If you will make C<$a> or C<$b> lexical, except this module to break, |
105
|
|
|
|
|
|
|
as they aren't referencing global variables anymore. This affects every |
106
|
|
|
|
|
|
|
function that uses those variables, even C builtin. |
107
|
|
|
|
|
|
|
L. |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
When using C<$a> or C<$b> only once in the code (with the exception for |
110
|
|
|
|
|
|
|
C builtin), Perl will warn you. This also affects other modules |
111
|
|
|
|
|
|
|
that use those variables. To remove warnings about this, use following |
112
|
|
|
|
|
|
|
code. |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
no warnings 'once'; |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=head1 AUTHOR |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
Konrad Borowski |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
This software is copyright (c) 2012 by Konrad Borowski. |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
This is free software; you can redistribute it and/or modify it under |
125
|
|
|
|
|
|
|
the same terms as the Perl 5 programming language system itself. |