解释Perl代码以KB,MB,GB等显示多个字节
发布时间:2020-12-15 21:53:58 所属栏目:大数据 来源:网络整理
导读:给定一些字节,它将其格式化为“字节”,“KB”,“MB”或“GB”……但我不明白的是部分: $_-[1],$_-[0] 是不是传递给地图只是一个哈希数组?那么如何才能有0和1指数呢? sub fmt { my $bytes = shift; return ( sort { length $a = length $b } map { sprintf
给定一些字节,它将其格式化为“字节”,“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]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |