JavaScript ArrayBuffer, Uint8Array und DataView in Perl

Typed Arrays in JavaScript gehen auch mit Perl zu machen

Betrachte untenstehenden Code in JavaScript:

buffer = new ArrayBuffer(1028);
dav = new DataView(buffer);
dav.getUint32(0);

Genau dasselbe können wir auch mit Perl machen. Man nehme eine beliebige Bytesequenz und erzeuge damit ein Uint8Array was gleichermaßen quasi ein DataView-Objekt ist. Untenstehend eine einfache Klasse welche die beiden Methoden getUint32 und getUint16 implementiert:

package DataView;

use strict;
use warnings;

sub new{
    my $class  = shift;
    my $binary = shift;
    return eval{
        die "No Binary given!\n" unless $binary;
        my $self = bless[unpack 'C*', $binary], $class;
    };        
}

sub getUint16{
    my $self = shift;
    my $offs = shift;
    my $LE = shift;
    my $bin = pack "CC", $self->[$offs], $self->[$offs+1];
    return $LE ? unpack("v", $bin) : unpack("n", $bin); 
}

sub getUint32{
    my $self = shift;
    my $offs = shift;
    my $LE = shift;
    my $bin = pack "CCCC", $self->[$offs], $self->[$offs+1], $self->[$offs+2], $self->[$offs+3];
    return $LE ? unpack("V", $bin) : unpack("N", $bin); 
}

sub getString{
    my $self = shift;
    my $offs = shift;
    my $len  = shift;
    return pack "C*", map{$self->[$_]} ($offs..$offs+$len-1);
}

## Anwendung:
my $dav = DataView->new($binary);
print $dav->getUint32(0,1); # Little Endian

Über OOP in Perl

In Perl ist eine Klasseninstanz eine Referenz die mit dem Namen einer Klasse gesegnet ist. In der Regel ist diese Referenz eine Hash-Referenz, in der oben vorgestellten Klasse jedoch ist es eine Array-Referenz. Infolge der Segnung dieser Array-Referenz mit einem Klassennamen weiß diese Referenz zu welcher Klasse sie gehört und kann damit die in der Klasse definierten Methoden ausführen.


Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.