gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:01:56 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这是一个老问题,已经得到正确回答,但以防万一您的程序受限于核心模块并且您不能使用 Number::Bytes::Human在这里,您还有其他几个我随时间收集的选项。我保留它们也是因为每个都使用不同的 Perl 方法,并且是 TIMTOWTDI 的一个很好的例子。 :

  • 示例 1:使用 state 避免每次都重新初始化变量(在 perl 5.16 之前您需要使用 feature state 或 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]);
    }
  • 示例 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,也请查看源代码以了解您需要注意的所有内容。

    关于perl - 如何使用 Perl 获取文件的大小(以兆字节为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/511785/

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