解释Perl代码以KB,MB,GB等显示多个字节

前端之家收集整理的这篇文章主要介绍了解释Perl代码以KB,MB,GB等显示多个字节前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定一些字节,它将其格式化为“字节”,“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];
}

猜你在找的Perl相关文章