给定一些字节,它将其格式化为“字节”,“KB”,“MB”或“GB”……但我不明白的是部分:
$_->[1],$_->[0]
是不是传递给地图只是一个哈希数组?那么如何才能有0和1指数呢?
sub fmt { my $bytes = shift; return ( sort { length $a <=> length $b } map { sprintf '%.3g%s',$bytes/1024**$_->[1],$_->[0] } [" bytes"=>0],[KB=>1],[MB=>2],[GB=>3] )[0]; }
解决方法
这是一段糟糕的代码.有人在炫耀
传递给map的列表是:匿名数组列表
[ " bytes" => 0 ],[ KB => 1 ],[ MB => 2 ],[ GB => 3 ]
而胖逗号运算符=>通常在哈希文字的上下文中看到,这并不是它的全部好处.它与普通逗号相同,只是将隐含引用裸字左手操作数.没有它,列表将是相同的
[ ' bytes',0 ],[ 'KB',1 ],[ 'MB',2 ],[ 'GB',3 ]
这是相同的函数,中间映射语句的结果扩展为一个单独的数组@variations,我使用Data :: Dump转储它以显示它正在做什么
传递给map的列表是一些匿名数组 – 每个数组都包含后缀字符串以及该字符串对应的1024的相应功率. return语句只选择最短的表示
use strict; use warnings 'all'; use feature 'say'; use Data::Dump; say fmt(987 * 1024**2); sub fmt { my $bytes = shift; my @variations = map { sprintf '%.3g%s',$bytes/1024 ** $_->[1],$_->[0] } [ " bytes" => 0 ],[ GB => 3 ]; dd \@variations; return ( sort { length $a <=> length $b } @variations ) [0]; }
产量
["1.03e+009 bytes","1.01e+006KB","987MB","0.964GB"] 987MB
我通常使用类似的东西. sprintf的滑稽动作是确保永远不会显示一个字节的分数
sub fmt2 { my ($n) = @_; my @suffix = ( '',qw/ K M G T P E / ); my $i = 0; until ( $n < 1024 or $i == $#suffix ) { $n /= 1024; ++$i; } sprintf $i ? '%.3g%sB' : '%.0f%sB',$n,$suffix[$i]; }