[SP-pm] Write Binary!
Luis Motta Campos
luismottacampos em yahoo.co.uk
Quinta Abril 26 07:57:07 PDT 2007
On Apr 26, 2007, at 4:24 PM, Igor Sutton Lopes wrote:
> On Apr 26, 2007, at 3:19 PM, Henrique Rennó wrote:
>> Na verdade o que estou querendo fazer é escrever os valores de uma
>> matriz 2D em um arquivo binário como uma seqüência única de
>> valores. Por exemplo, em C, se eu definir uma matriz 2D float
>> usaria o fwrite da seguinte forma: fwrite(matriz, sizeof(float),
>> N, fpointer) onde N é igual a número total de elementos na matriz
>> e fpointer o ponteiro para o arquivo. Não achei em perl uma função
>> para escrever a matriz em um arquivo no modo binário.
>
> Qual é a aplicação disso?
Você quer saber a aplicação do fwrite() ou de "escrever uma matriz
2D em um arquivo binário"? ;-)
Bom, para começar, eu não sei o que é uma matriz "2D". Acho que a
gente pode definir uma classe para isso, e armazenar ela num array
(quase tudo pode ser armazenado num array): ;-)
package Matriz2D;
use strict;
use warnings;
sub new {
my ( $class, $x_size, $y_size )= @_;
return bless { _size => { x => $x_size, y => $y_size }, _values
=> [] }, $class;
}
# TODO: construtor que aceite um array ref para usar como a matriz.
# TODO: uma forma de setar uma "matriz" passando um arrayref
completo.
# TODO: verificação de erro, para saber se você não está
# tentando colocar um elemento fora da matriz definida.
sub set {
my ( $self, $x, $y, $val ) = @_;
$self->{_values}[ $self->{_size}{x} * $y + $x ] = $val;
return $self;
}
sub get {
my ( $self, $x, $y ) = @_;
return $self->{_values}[ $self->{_size}{x} * $y + $x ];
}
sub pack {
my $self = shift;
return pack ( 'B*', @{$self->{_values}} );
}
1;
# Acho que isso resolve o seu problema.
# Para usar:
package main;
use strict;
use warnings;
use Matrix2D;
my $matrix = new Matrix2D;
# popule a matriz usando Matrix2D::set() e Matrix2D::get()
open my $fh, '>', '/tmp/test.bin'
or die "$!";
binmode $fh;
print $fh $matrix->pack;
close $fh or die "$!";
__END__
Atenção: eu não testei o código, você pode ter problemas sérios.
Putamplexos!
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}
Mais detalhes sobre a lista de discussão SaoPaulo-pm