当前位置:  开发笔记 > 编程语言 > 正文

如何使用Perl获取文件大小(以兆字节为单位)?

如何解决《如何使用Perl获取文件大小(以兆字节为单位)?》经验,为你挑选了3个好方法。

我想以兆字节为单位获取磁盘上文件的大小.使用-s运算符给出了大小(以字节为单位),但我假设将其除以幻数是一个坏主意:

my $size_in_mb = (-s $fh) / (1024 * 1024);

我应该只使用只读变量来定义1024,还是以编程方式获取千字节的字节数?

编辑:更新了错误的计算.



1> jrockway..:

如果您想避免幻数,请尝试CPAN模块Number :: Bytes :: Human.

use Number::Bytes::Human qw(format_bytes);
my $size = format_bytes(-s $file); # 4.5M



2> Peter Stuifz..:

你当然可以创建一个计算它的函数.这是比在这个实例中创建常量更好的解决方案.

sub size_in_mb {
    my $size_in_bytes = shift;
    return $size_in_bytes / (1024 * 1024);
}

不需要常数.将1024某些变量/常量更改为不会使此代码更具可读性.



3> Pablo Marin-..:

这是一个古老的问题,并且已经得到了正确的答案,但是以防万一您的程序被限制在核心模块上,并且您无法使用Number :: Bytes :: Human,这里还有一些其他的选择,这些都是我长期以来收集的。我保留它们也是因为每个人都使用不同的Perl方法,并且是TIMTOWTDI的一个很好的示例:

示例1:使用状态避免每次都重新初始化变量(在perl 5.16之前,您需要使用功能状态或perl -E)

http://kba49.wordpress.com/2013/02/17/format-file-sizes-human-read-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]);
    }

示例2:使用排序图

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]
  }

示例3:利用1 Gb = 1024 Mb,1 Mb = 1024 Kb和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

示例4:使用++$n and ... until ..获取数组的索引

# 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;  

即使您不能使用Number :: Bytes :: Human,也请查看源代码以查看您需要了解的所有内容。

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有