我正在编写一个脚本,它将通过我的ftpd日志读取并生成如下哈希:
$stats = \{
'user1' => {
'files' => 281,
'size' => '3724251021'
},
'user2' => {
'files' => 555,
'size' => '7385856997'
},
'user3' => {
'files' => 235,
'size' => '3716904486'
},
'user4' => {
'files' => 578,
'size' => '8536026929'
}
};
Run Code Online (Sandbox Code Playgroud)
如何使用按大小排序的键来访问此哈希?
我试过这个但是我得到一个错误,说不是hashref
foreach my $user (sort { $$stats->{$a}->{size} cmp $$stats->{$b}->{size} } keys %$stats) {
blahblahblah...
}
Run Code Online (Sandbox Code Playgroud)
FMc*_*FMc 16
您的问题与排序无关,而是与您定义的不寻常方式有关$stats- 即作为哈希引用的引用.
my %hash = (a => 1, b => 2);
my $hash_ref = {c => 3, d => 4};
my $ref_to_hash_ref = \{e => 5, f => 6};
Run Code Online (Sandbox Code Playgroud)
你可以使用这个:
my $stats = { ... };
foreach my $user (
sort { $stats->{$a}{size} <=> $stats->{$b}{size} }
keys %$stats ) {
...
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的必须做ref-to-hash-ref的话:
my $stats = \{ ... };
foreach my $user (
sort { $$stats->{$a}{size} <=> $$stats->{$b}{size} }
keys %$$stats ) {
...
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您可能希望使用<=>(数字比较)而不是cmp(字符串比较).
您可以传递函数进行排序,以便按所需顺序获取值。
#!/usr/bin/perl
use strict;
my $stats = {
'user1' => {
'files' => 281,
'size' => '3724251021'
},
'user2' => {
'files' => 555,
'size' => '7385856997'
},
'user3' => {
'files' => 235,
'size' => '3716904486'
},
'user4' => {
'files' => 578,
'size' => '8536026929'
}
};
foreach my $key (sort sortBySize (keys(%$stats)))
{
print $key, " => ", $stats->{$key}->{'files'}, " - ",
$stats->{$key}->{'size'}, "\n";
}
exit;
sub sortBySize
{
return $stats->{$b}->{'size'} <=> $stats->{$a}->{'size'};
}
Run Code Online (Sandbox Code Playgroud)
输出:
user4 => 578 - 8536026929
user2 => 555 - 7385856997
user1 => 281 - 3724251021
user3 => 235 - 3716904486
Run Code Online (Sandbox Code Playgroud)
如果希望它们从最低到最高排序,则只需要在sortBySize函数中切换$ b和$ a即可:
return $stats->{$a}->{'size'} <=> $stats->{$b}->{'size'};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5144 次 |
| 最近记录: |