Frage

Ich will die Größe einer Datei auf der Festplatte in Megabyte erhalten. Mit Hilfe des -s Operator gibt mir die Größe in Bytes, aber ich gehe davon aus, dass dann diese Division durch eine magische Zahl ist eine schlechte Idee:

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

Soll ich nur eine schreibgeschützte Variable 1024 zu definieren, oder gibt es eine programmatische Art und Weise die Menge an Bytes in einem Kilobyte zu erhalten?

EDIT:. Aktualisiert die falsche Berechnung

War es hilfreich?

Lösung

Wenn Sie magische Zahlen vermeiden möchten, versuchen Sie das CPAN-Modul Nummer: :. Bytes :: Menschen

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

Andere Tipps

Sie könnte natürlich eine Funktion zur Berechnung dieser erstellen. Das ist eine bessere Lösung als Konstanten in diesem Fall zu schaffen.

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

Keine Notwendigkeit für Konstanten. Ändern des 1024 zu irgendeiner Art von Variable / Konstante wird dieser Code lesbarer nicht machen.

Nun, es nicht 1024 Byte in einem meg ist, gibt es 1024 Bytes in einem K und 1024 K in einem meg ...

Das heißt, 1024 ist eine sichere „magische“ Zahl, die Sie nie Ihr Programm in jedem System ändern können damit rechnen, zu arbeiten.

Ich würde dies in eine Variable gelesen, anstatt eine magische Zahl verwenden. Selbst wenn magischen Zahlen werden sich nicht ändern, wie die Anzahl der Bytes in einem Megabyte, eine gut benannte Konstante ist eine gute Praxis, weil es Ihr Code besser lesbar macht. Es macht es sofort offensichtlich alle anderen, was Ihre Absicht ist.

Dies ist eine alte Frage und wurde bereits richtig beantwortet, aber nur für den Fall, dass Ihr Programm auf die Core-Module beschränkt und man kann nicht a href verwenden <= "http://search.cpan.org/~dagobert/ Nummer-Bytes-Mensch / Human.pm“rel =‚nofollow‘> Anzahl :: Bytes :: Menschen hier haben Sie einige andere Optionen ich habe im Laufe der Zeit gesammelt. Ich habe immer sie auch, weil jeder einen anderen Perl Ansatz verwenden und ist ein schönes Beispiel für TIMTOWTDI :

  • Beispiel 1: uses Zustand der Variablen jedes Mal zu vermeiden neu initialisieren (vor perl 5,16 Sie müssen Feature Zustand verwenden oder Perl -E)

http: // kba49 .wordpress.com / 2013/02/17 / Format-Datei-Größen-menschenlesbare-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]);
    }
  • Beispiel 2: Verwendung Art Karte

.

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]
  }
  • Beispiel 3: Nutzen Sie die Tatsache, dass 1 GB = 1024 MB, 1 Mb = 1024 Kb und 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
  • Beispiel 4: Verwendung von ++$n and ... until .. einen Index für das Array
  • zu erhalten,

.

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

Auch wenn Sie nicht Nummer verwenden können :: Bytes :: Mensch, werfen Sie einen Blick auf den Code Quelle all die Dinge zu sehen, die Sie bewusst sein müssen.

1) Sie wollen nicht, dass Sie 1024. Kilobyte gibt. Sie wollen 1024 * 1024 oder 1048576.

2) Warum durch eine magische Zahl wäre Dividieren eine schlechte Idee? Es ist nicht wie die Anzahl von Bytes in einem Megabyte wird jemals ändern. denken Dinge nicht zu viel.

Sie mich nicht falsch, aber: Ich denke, dass 1024 als magischen Variable erklärt ein bisschen zu weit geht, das ist ein bisschen wie „ONE $ = 1; TWO $ = 2;“ etc.

Ein Kilobyte ist seit mehr als 20 Jahren als 1024 Bytes fälschlicherweise erklärt, und ich bezweifle ernsthaft, dass die Betriebssystemhersteller jemals diesen Fehler korrigieren und es bis 1000 ändern.

Was Sinn obwohl machen könnte, ist nicht offensichtlich Sachen zu erklären, wie „$ Megabyte = 1024 * 1024“, da diese besser lesbar als 1.048.576 ist.

Da die -s Bediener die Dateigröße in Byte zurückgibt, sollten Sie wahrscheinlich so etwas wie

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

und Verwendung int (), wenn Sie eine runde Zahl benötigen. Es ist nicht wie die Abmessungen von KB oder MB werden jederzeit in naher Zukunft ändern:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top