Perl - E / S de archivos
Los conceptos básicos del manejo de archivos son simples: asocia un filehandle con una entidad externa (generalmente un archivo) y luego use una variedad de operadores y funciones dentro de Perl para leer y actualizar los datos almacenados dentro del flujo de datos asociado con el identificador de archivo.
Un identificador de archivo es una estructura interna de Perl con nombre que asocia un archivo físico con un nombre. Todos los identificadores de archivo tienen acceso de lectura / escritura, por lo que puede leer y actualizar cualquier archivo o dispositivo asociado con un identificador de archivo. Sin embargo, cuando asocia un identificador de archivo, puede especificar el modo en el que se abre el identificador de archivo.
Tres identificadores de archivo básicos son: STDIN, STDOUTy STDERR, que representan dispositivos de entrada estándar, salida estándar y error estándar, respectivamente.
Abrir y cerrar archivos
Hay dos funciones siguientes con múltiples formularios, que se pueden utilizar para abrir cualquier archivo nuevo o existente en Perl.
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
Aquí FILEHANDLE es el identificador de archivo devuelto por el open función y EXPR es la expresión que tiene el nombre del archivo y el modo de abrir el archivo.
Función abierta
A continuación se muestra la sintaxis para abrir file.txten modo de solo lectura. En este caso, el signo menos que <indica que el archivo debe abrirse en modo de solo lectura.
open(DATA, "<file.txt");
Aquí DATA es el identificador del archivo, que se utilizará para leer el archivo. Aquí está el ejemplo, que abrirá un archivo e imprimirá su contenido en la pantalla.
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";
while(<DATA>) {
print "$_";
}
A continuación se muestra la sintaxis para abrir file.txt en modo de escritura. Aquí, el signo menos que> indica que el archivo debe abrirse en el modo de escritura.
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
Este ejemplo realmente trunca (vacía) el archivo antes de abrirlo para escribir, lo que puede no ser el efecto deseado. Si desea abrir un archivo para leer y escribir, puede poner un signo más antes de los caracteres> o <.
Por ejemplo, para abrir un archivo para actualizarlo sin truncarlo:
open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";
Para truncar el archivo primero:
open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";
Puede abrir un archivo en el modo anexar. En este modo, el punto de escritura se establecerá al final del archivo.
open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";
Un doble >> abre el archivo para agregarlo, colocando el puntero del archivo al final, para que pueda comenzar a agregar información inmediatamente. Sin embargo, no puede leer de él a menos que también coloque un signo más delante de él:
open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";
A continuación se muestra la tabla, que da los posibles valores de diferentes modos.
No Señor. | Entidades y definición |
---|---|
1 | < or r Acceso de solo lectura |
2 | > or w Crea, escribe y trunca |
3 | >> or a Escribe, agrega y crea |
4 | +< or r+ Lee y escribe |
5 | +> or w+ Lee, escribe, crea y trunca |
6 | +>> or a+ Lee, escribe, agrega y crea |
Función Sysopen
los sysopen La función es similar a la función principal abierta, excepto que usa el sistema open() función, utilizando los parámetros que se le proporcionan como los parámetros para la función del sistema -
Por ejemplo, para abrir un archivo para actualizarlo, emula el +<filename formato de abierto -
sysopen(DATA, "file.txt", O_RDWR);
O para truncar el archivo antes de actualizar -
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
Puede usar O_CREAT para crear un nuevo archivo y O_WRONLY- para abrir el archivo en modo de solo escritura y O_RDONLY - para abrir el archivo en modo de solo lectura.
los PERMSEl argumento especifica los permisos de archivo para el archivo especificado, si es necesario crearlo. Por defecto se necesita0x666.
A continuación se muestra la tabla, que da los posibles valores de MODE.
No Señor. | Entidades y definición |
---|---|
1 | O_RDWR Lee y escribe |
2 | O_RDONLY Solo lectura |
3 | O_WRONLY Escribir solamente |
4 | O_CREAT Crea el archivo |
5 | O_APPEND Anexar el archivo |
6 | O_TRUNC Truncar el archivo |
7 | O_EXCL Se detiene si el archivo ya existe |
8 | O_NONBLOCK Usabilidad sin bloqueo |
Cerrar función
Para cerrar un identificador de archivo y, por lo tanto, disociar el identificador de archivo del archivo correspondiente, utilice el closefunción. Esto vacía los búferes del identificador de archivos y cierra el descriptor de archivos del sistema.
close FILEHANDLE
close
Si no se especifica ningún FILEHANDLE, cierra el archivo actualmente seleccionado. Devuelve verdadero solo si pudo vaciar con éxito los búferes y cerrar el archivo.
close(DATA) || die "Couldn't close file properly";
Leer y escribir archivos
Una vez que tenga un identificador de archivo abierto, debe poder leer y escribir información. Hay varias formas diferentes de leer y escribir datos en el archivo.
El operador <FILEHANDL>
El método principal para leer la información de un identificador de archivo abierto es el operador <FILEHANDLE>. En un contexto escalar, devuelve una sola línea del identificador de archivo. Por ejemplo
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
Cuando usa el operador <FILEHANDLE> en un contexto de lista, devuelve una lista de líneas del filehandle especificado. Por ejemplo, para importar todas las líneas de un archivo a una matriz:
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
Función getc
La función getc devuelve un solo carácter del FILEHANDLE especificado, o STDIN si no se especifica ninguno -
getc FILEHANDLE
getc
Si hubo un error o el identificador de archivo está al final del archivo, se devuelve undef en su lugar.
función de lectura
La función de lectura lee un bloque de información del identificador de archivo almacenado en búfer: esta función se utiliza para leer datos binarios del archivo.
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
La longitud de los datos leídos está definida por LENGTH, y los datos se colocan al comienzo de SCALAR si no se especifica ningún OFFSET. De lo contrario, los datos se colocan después de los bytes OFFSET en ESCALAR. La función devuelve el número de bytes leídos en caso de éxito, cero al final del archivo o undef si hubo un error.
Función de impresión
Para todos los diferentes métodos utilizados para leer información de los identificadores de archivos, la función principal para escribir información es la función de impresión.
print FILEHANDLE LIST
print LIST
print
La función de impresión imprime el valor evaluado de LIST en FILEHANDLE, o en el filehandle de salida actual (STDOUT por defecto). Por ejemplo
print "Hello World!\n";
Copiando documentos
Aquí está el ejemplo, que abre un archivo existente file1.txt y lo lee línea por línea y genera otro archivo de copia file2.txt.
#!/usr/bin/perl
# Open file to read
open(DATA1, "<file1.txt");
# Open new file to write
open(DATA2, ">file2.txt");
# Copy data from one file to another.
while(<DATA1>) {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
Cambiar el nombre de un archivo
Aquí hay un ejemplo, que muestra cómo podemos cambiar el nombre de un archivo file1.txt a file2.txt. Suponiendo que el archivo está disponible en el directorio / usr / test.
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
Esta función renames toma dos argumentos y simplemente cambia el nombre del archivo existente.
Eliminar un archivo existente
Aquí hay un ejemplo, que muestra cómo eliminar un archivo file1.txt usando el unlink función.
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
Posicionamiento dentro de un archivo
Puedes usar para tell función para conocer la posición actual de un archivo y seek función para señalar una posición particular dentro del archivo.
decir función
El primer requisito es encontrar su posición dentro de un archivo, lo que hace usando la función de decir:
tell FILEHANDLE
tell
Esto devuelve la posición del puntero de archivo, en bytes, dentro de FILEHANDLE si se especifica, o el identificador de archivo seleccionado predeterminado actual si no se especifica ninguno.
función de búsqueda
La función de búsqueda coloca el puntero del archivo en el número especificado de bytes dentro de un archivo:
seek FILEHANDLE, POSITION, WHENCE
La función utiliza la función del sistema fseek, y tiene la misma capacidad de posicionarse en relación con tres puntos diferentes: el inicio, el final y la posición actual. Para ello, especifica un valor para WHENCE.
Zero establece el posicionamiento relativo al inicio del archivo. Por ejemplo, la línea establece el puntero del archivo en el byte 256 del archivo.
seek DATA, 256, 0;
Informacion del archivo
Puede probar ciertas funciones muy rápidamente dentro de Perl utilizando una serie de operadores de prueba conocidos colectivamente como pruebas -X. Por ejemplo, para realizar una prueba rápida de los distintos permisos en un archivo, puede usar un script como este:
#/usr/bin/perl
my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
push @description, 'binary' if (-B _);
push @description, 'a socket' if (-S _);
push @description, 'a text file' if (-T _);
push @description, 'a block special file' if (-b _);
push @description, 'a character special file' if (-c _);
push @description, 'a directory' if (-d _);
push @description, 'executable' if (-x _);
push @description, (($size = -s _)) ? "$size bytes" : 'empty';
print "$file is ", join(', ',@description),"\n";
}
Aquí está la lista de características, que puede verificar para un archivo o directorio:
No Señor. | Operador y Definición |
---|---|
1 | -A La hora de inicio del script menos la hora del último acceso al archivo, en días. |
2 | -B ¿Es un archivo binario? |
3 | -C La hora de inicio del script menos la hora del último cambio de inodo del archivo, en días. |
3 | -M La hora de inicio del script menos la hora de modificación del archivo, en días. |
4 | -O ¿El archivo es propiedad del ID de usuario real? |
5 | -R ¿El archivo es legible por el ID de usuario real o el grupo real? |
6 | -S ¿El archivo es un socket? |
7 | -T ¿Es un archivo de texto? |
8 | -W ¿Se puede escribir el archivo con el ID de usuario real o el grupo real? |
9 | -X ¿Es el archivo ejecutable por el ID de usuario real o el grupo real? |
10 | -b ¿Es un archivo especial de bloque? |
11 | -c ¿Es un archivo especial de personaje? |
12 | -d ¿El archivo es un directorio? |
13 | -e ¿Existe el archivo? |
14 | -f ¿Es un archivo simple? |
15 | -g ¿El archivo tiene el bit setgid establecido? |
dieciséis | -k ¿El archivo tiene el bit adhesivo configurado? |
17 | -l ¿Es el archivo un enlace simbólico? |
18 | -o ¿El archivo pertenece al ID de usuario efectivo? |
19 | -p ¿El archivo es una tubería con nombre? |
20 | -r ¿El archivo es legible por el usuario efectivo o el ID de grupo? |
21 | -s Devuelve el tamaño del archivo, tamaño cero = archivo vacío. |
22 | -t ¿Se abre el identificador de archivos con un TTY (terminal)? |
23 | -u ¿El archivo tiene el bit setuid configurado? |
24 | -w ¿Puede escribir el archivo el usuario efectivo o el ID de grupo? |
25 | -x ¿Es el archivo ejecutable por el usuario efectivo o ID de grupo? |
26 | -z ¿El tamaño del archivo es cero? |