gpt4 book ai didi

perl - 解释 Perl 代码以 KB、MB、GB 等单位显示字节数

转载 作者:行者123 更新时间:2023-12-04 10:06:57 25 4
gpt4 key购买 nike

给定一些字节,它将其格式化为“字节”、“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 ]

这是与中间 map 的结果相同的函数语句扩展为单独的数组 @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 ],
[ KB => 1 ],
[ MB => 2 ],
[ GB => 3 ];

dd \@variations;

return ( sort { length $a <=> length $b } @variations ) [0];
}

输出
["1.03e+009 bytes", "1.01e+006KB", "987MB", "0.964GB"]
987MB

我通常使用类似的东西。与 sprintf 的滑稽 Action 确保永远不会显示字节的小数部分
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 - 解释 Perl 代码以 KB、MB、GB 等单位显示字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37124052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com