Đây là câu hỏi cũ và đã được trả lời đúng, nhưng chỉ trong trường hợp chương trình của bạn bị ràng buộc với các mô-đun cốt lõi và bạn không thể sử dụng Number::Bytes::Human tại đây bạn có một số tùy chọn khác mà tôi đã thu thập theo thời gian.Tôi đã giữ họ cũng bởi vì mỗi người sử dụng một cách tiếp cận Perl khác nhau và là một ví dụ tốt đẹp cho TIMTOWTDI:
- dụ 1: sử dụng nhà nước để tránh reinitialize biến mỗi lần (trước perl 5,16 bạn cần phải sử dụng nhà nước tính năng hay perl -E)
http://kba49.wordpress.com/2013/02/17/format-file-sizes-human-readable-in-perl/
sub formatSize {
my $size = shift;
my $exp = 0;
state $units = [qw(B KB MB GB TB PB)];
for (@$units) {
last if $size < 1024;
$size /= 1024;
$exp++;
}
return wantarray ? ($size, $units->[$exp]) : sprintf("%.2f %s", $size, $units->[$exp]);
}
- dụ 2: sử dụng loại bản đồ
.
sub scaledbytes {
# http://www.perlmonks.org/?node_id=378580
(sort { length $a <=> length $b
} map { sprintf '%.3g%s', $_[0]/1024**$_->[1], $_->[0]
}[" bytes"=>0]
,[KB=>1]
,[MB=>2]
,[GB=>3]
,[TB=>4]
,[PB=>5]
,[EB=>6]
)[0]
}
- dụ 3: Tận dụng lợi thế của thực tế là 1 Gb = 1024 Mb, 1 Mb = 1024 Kb và 1024 = 2 ** 10:
.
# http://www.perlmonks.org/?node_id=378544
my $kb = 1024 * 1024; # set to 1 Gb
my $mb = $kb >> 10;
my $gb = $mb >> 10;
print "$kb kb = $mb mb = $gb gb\n";
__END__
1048576 kb = 1024 mb = 1 gb
- dụ 4: sử dụng
++$n and ... until ..
để có được một chỉ số cho mảng
.
# http://www.perlmonks.org/?node_id=378542
#! perl -slw
use strict;
sub scaleIt {
my($size, $n) =(shift, 0);
++$n and $size /= 1024 until $size < 1024;
return sprintf "%.2f %s",
$size, (qw[ bytes KB MB GB ])[ $n ];
}
my $size = -s $ARGV[ 0 ];
print "$ARGV[ 0 ]: ", scaleIt $size;
Thậm chí nếu bạn không thể sử dụng Số :: Bytes :: Con người, hãy xem mã nguồn để xem tất cả những thứ bạn cần biết.
Nguồn
2014-03-16 09:43:33
Mô-đun này hoạt động tốt, cảm ơn. – cowgod
vừa phát hiện ra nó cũng có thể phân tích cú pháp chuỗi có thể đọc được của con người trở lại thành byte! –