sub validfields { return $_validfields } sub _packdata { #****m* DataFile/_packdata # USAGE # $file->_packdata() # sérialise pour pack() tous les records # d'un fichier #*** my $self = shift ; my @stringrecords ; foreach my $record_ref ( @{ $self->{records} } ) { # il faut déréférencer l'objet record avant de l'appeler my $recdata = $self->_serialize_fields( $$record_ref->getdata() ); push @stringrecords, $recdata if $recdata ; } @stringrecords ? return join ( '', @stringrecords ) : return } sub _serialize_fields { #****m* DataFile/serialize_fields # USAGE # $file->_serialize_fields( $data_href ) # sérialise les données d'un record #*** my $self = shift ; my $data = shift ; my $output = ''; my $allfields = $self->validfields() ; # on itère sur tous les champs possibles foreach my $k ( keys %$allfields ) { # on insère la longueur en dernier next if $k eq 'LENGTH' ; my $value ; ( exists $data->{$k} ) ? ( $value = $data->{$k} ) : ( $value = $allfields->{$k}{default} ) ; # le champ COLLATE est le seul qui soit un BYTE # les champs "noms courts" doivent contenir 0x01 # la longueur est corrigée de la longueur du format $output .= pack( $allfields->{$k}{format}. ( $allfields->{$k}{length} - length($allfields->{$k}{format}) + 1 ), $value ); } # on insère la longueur du champ au début my $datalength = length($output) + 5; $output = pack( "A5",$datalength ) . $output ; print $output ; return $output }