[comp.lang.perl] Low Level Array Handling in Perl?

tony@oha.UUCP (Tony Olekshy) (09/27/90)

Here is an idea for handling arrays in Perl that I have not yet heard of.
Comments?

$array = &MakeArray("l", 14, 12);	# Type, Rows, Columns.

for ($r = 0; $r < 14; $r += 1) {
    for ($c = 0; $c < 12; $c += 1) {
	&PutArray(*array, $r, $c, 100 * ($r+1) + $c + 1);
	}
    }

for ($r = 0; $r < 14; $r += 1) {
    for ($c = 0; $c < 12; $c += 1) {
	printf " %4d", &GetArray(*array, $r, $c);
	}
    print "\n";
    }

sub MakeArray
{
    local($type, $rows, $cols) = ($_[0], $_[1], $_[2]);
    local($tmpl8) = "aLL";	 # Type, Rows, Cols.
    $ArrayHeader = length(pack($tmpl8, " ", 0, 0));
    $tmpl8 .= $type x ($rows * $cols);
    return pack($tmpl8, $type, $rows, $cols);
    }

sub PutArray
{
    local(*array, $row, $col, $val) = ($_[0], $_[1], $_[2], $_[3]);
    local($type, $rows, $cols) = unpack("aLL", $array);
    local($sizeof) = length(pack($type, 0));
    substr($array, $ArrayHeader + ($row * $cols + $col) * $sizeof, $sizeof)
	= pack($type, $val);
    }

sub GetArray
{
    local(*array, $row, $col) = ($_[0], $_[1], $_[2]);
    local($type, $rows, $cols) = unpack("aLL", $array);
    local($sizeof) = length(pack($type, 0));
    return unpack($type,
	substr($array, $ArrayHeader + ($row * $cols + $col) * $sizeof, $sizeof)
	);
    }