Perl을 사용하여 메가 바이트로 파일 크기를 얻으려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/511785

문제

메가 바이트로 디스크에서 파일 크기를 얻고 싶습니다. 사용 -s 연산자는 나에게 크기를 바이트로 제공하지만, 이것을 마법 번호로 나누는 것은 나쁜 생각이라고 가정 할 것입니다.

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

읽기 전용 변수를 사용하여 1024를 정의해야합니까? 아니면 킬로바이트에서 바이트 양을 얻는 프로그래밍 방식이 있습니까?

편집하다: 잘못된 계산을 업데이트했습니다.

도움이 되었습니까?

해결책

마법 번호를 피하려면 CPAN 모듈을 사용해보십시오. 숫자 :: 바이트 :: 인간.

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

다른 팁

물론 이것을 계산하기위한 함수를 만들 수 있습니다. 이 경우 상수를 만드는 것보다 더 나은 솔루션입니다.

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

상수가 필요하지 않습니다. 변경 1024 어떤 종류의 변수/상수에는이 코드가 더 읽기 쉽게 만들 수 없습니다.

글쎄, 메그에는 1024 바이트가없고, k에는 1024 바이트가 있고, 메그에는 1024 K가 있습니다 ...

즉, 1024는 귀하의 프로그램이 예상 할 수있는 시스템에서는 결코 변경되지 않을 안전한 "마법"번호입니다.

나는 이것을 마법 번호를 사용하기보다는 변수로 읽을 것입니다. 메가 바이트의 바이트 수와 같이 마법의 숫자가 변하지 않더라도 잘 지명 된 상수를 사용하는 것은 코드를 더 읽기 쉽게 만들기 때문에 좋은 관행입니다. 그것은 당신의 의도가 무엇인지 다른 모든 사람들에게 즉시 분명하게 만듭니다.

이것은 오래된 질문이며 이미 올바르게 답변되었지만 프로그램이 핵심 모듈에 제한되어 있고 사용할 수없는 경우를 대비하여 숫자 :: 바이트 :: 인간 여기에는 시간이 지남에 따라 수집 된 몇 가지 다른 옵션이 있습니다. 나는 각자가 다른 perl 접근법을 사용하고 좋은 예이기 때문에 그들을 유지했습니다. Timtowtdi:

  • 예 1 : 상태를 사용하여 매번 변수를 다시 이용하지 않도록합니다 (Perl 5.16 이전에는 기능 상태 또는 Perl -e를 사용해야합니다).

http://kba49.wordpress.com/2013/02/17/format-file-size-suman-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 : 1GB = 1024 MB, 1 MB = 1024 KB 및 1024 = 2 ** 10 : 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;  

번호 :: bytes :: human을 사용할 수 없더라도 소스 코드를 살펴보고 알아야 할 모든 것을 볼 수 있습니다.

1) 당신은 1024를 원하지 않습니다. 그것은 당신에게 킬로 바이트를 제공합니다. 1024*1024 또는 1048576을 원합니다.

2) 왜 마법의 숫자로 나누는 것이 나쁜 생각일까요? 메가 바이트의 바이트 수가 바뀌지 않습니다. 물건을 너무 많이 생각하지 마십시오.

나를 잘못 이해하지 마십시오. : 1024가 마법 변수로 선언하는 것이 너무 멀어지고 있다고 생각합니다. "$ 1 = 1; $ 2 = 2;"와 비슷합니다. 등.

킬로 바이트는 20 년이 넘게 1024 바이트로 거짓으로 선언되었으며, 운영 체제 제조업체가 해당 버그를 수정하고 1000으로 변경할 것이라고 심각하게 의심합니다.

그러나 의미가있는 것은 "$ megabyte = 1024 * 1024"와 같은 비 끔찍한 것들을 1048576보다 읽을 수 있기 때문에 거주하지 않는 것들을 선언하는 것입니다.

-S 연산자는 파일 크기를 바이트로 반환하므로 아마도 다음과 같은 작업을 수행해야합니다.

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

둥근 그림이 필요한 경우 int ()를 사용하십시오. KB 또는 MB의 차원이 가까운 시일 내에 언제든지 변경되는 것과는 다릅니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top