La función read

La función read FILEHANDLE,SCALAR,LENGTH,OFFSET lee desde el fichero FILEHANDLE un número de LENGTH caracteres en la variable SCALAR. Devuelve el número de caracteres leídos, 0 si es el final de fichero y undef si hubo un error. Es posible indicar que el fichero usado es binario mediante la función binmode (línea 7 en el ejemplo que sigue):
lhp@nereida:~/Lperl/src$ cat -n binaryfiles.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  my $buffer = "";
 4  my $file = shift;
 5
 6  open(FILE, "< $file");
 7  binmode(FILE);
 8  my $s = -s $file;
 9  read(FILE, $buffer, $s);
10  close(FILE);
11
12  open(FILE, "> $file.sal");
13  syswrite(FILE, $buffer, $s);
14  close(FILE);
15
16  my $c;
17  foreach (split(//, $buffer)) {
18    printf("%02x ", ord($_));
19    print "\n" unless ++$c % 20;
20  }
21  print "\n";
La salida de la ejecución nos permite comprobar que la copia de un ejecutable a.out preserva el formato binario:

lhp@nereida:~/Lperl/src$ ./binaryfiles.pl a.out | head -3
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00
01 00 00 00 e0 82 04 08 34 00 00 00 f4 0d 00 00 00 00 00 00
34 00 20 00 07 00 28 00 22 00 1f 00 06 00 00 00 34 00 00 00
lhp@nereida:~/Lperl/src$ ls -ltr | tail -2
-rwxr-xr-x   1 lhp lhp   341 2006-06-21 18:00 binaryfiles.pl
-rw-r--r--   1 lhp lhp  6969 2006-06-21 18:02 a.out.sal
lhp@nereida:~/Lperl/src$ chmod a+x a.out.sal; ./a.out.sal
hello world!
lhp@nereida:~/Lperl/src$ ./a.out
hello world!
lhp@nereida:~/Lperl/src$

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19