加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

解释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];
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读