[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