Perl - Arquivo I / O

Os princípios básicos de manipulação de arquivos são simples: você associa um filehandle com uma entidade externa (geralmente um arquivo) e, em seguida, use uma variedade de operadores e funções no Perl para ler e atualizar os dados armazenados no fluxo de dados associado ao filehandle.

Um filehandle é uma estrutura Perl interna nomeada que associa um arquivo físico a um nome. Todos os filehandles são capazes de acesso de leitura / gravação, para que você possa ler e atualizar qualquer arquivo ou dispositivo associado a um filehandle. No entanto, ao associar um identificador de arquivo, você pode especificar o modo no qual o identificador de arquivo é aberto.

Três identificadores básicos de arquivo são - STDIN, STDOUT, e STDERR, que representam entrada padrão, saída padrão e dispositivos de erro padrão, respectivamente.

Abrindo e fechando arquivos

Existem duas funções a seguir com vários formulários, que podem ser usados ​​para abrir qualquer arquivo novo ou existente em Perl.

open FILEHANDLE, EXPR
open FILEHANDLE

sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

Aqui FILEHANDLE é o identificador de arquivo retornado pelo open e EXPR é a expressão com o nome do arquivo e o modo de abertura do arquivo.

Função aberta

A seguir está a sintaxe para abrir file.txtno modo somente leitura. Aqui, menos de <sinal indica que o arquivo deve ser aberto no modo somente leitura.

open(DATA, "<file.txt");

Aqui, DATA é o identificador do arquivo, que será usado para ler o arquivo. Aqui está o exemplo, que abrirá um arquivo e imprimirá seu conteúdo na tela.

#!/usr/bin/perl

open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";

while(<DATA>) {
   print "$_";
}

A seguir está a sintaxe para abrir file.txt no modo de escrita. Aqui, o sinal de menos de> indica que o arquivo deve ser aberto no modo de gravação.

open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";

Na verdade, este exemplo trunca (esvazia) o arquivo antes de abri-lo para gravação, o que pode não ser o efeito desejado. Se você deseja abrir um arquivo para leitura e gravação, pode colocar um sinal de mais antes dos caracteres> ou <.

Por exemplo, para abrir um arquivo para atualização sem truncá-lo -

open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";

Para truncar o arquivo primeiro -

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

Você pode abrir um arquivo no modo de acréscimo. Neste modo, o ponto de gravação será definido para o final do arquivo.

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

Um duplo >> abre o arquivo para anexar, colocando o ponteiro do arquivo no final, para que você possa começar a anexar informações imediatamente. No entanto, você não pode ler a menos que também coloque um sinal de adição na frente dele -

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

A seguir está a tabela, que fornece os valores possíveis de diferentes modos

Sr. Não. Entidades e definição
1

< or r

Acesso somente leitura

2

> or w

Cria, grava e trunca

3

>> or a

Grava, acrescenta e cria

4

+< or r+

Lê e escreve

5

+> or w+

Lê, escreve, cria e trunca

6

+>> or a+

Lê, escreve, acrescenta e cria

Função Sysopen

o sysopen função é semelhante à função aberta principal, exceto que usa o sistema open() função, usando os parâmetros fornecidos a ela como os parâmetros para a função do sistema -

Por exemplo, para abrir um arquivo para atualização, emulando o +<filename formato de aberto -

sysopen(DATA, "file.txt", O_RDWR);

Ou para truncar o arquivo antes de atualizar -

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

Você pode usar O_CREAT para criar um novo arquivo e O_WRONLY- para abrir o arquivo no modo somente gravação e O_RDONLY - para abrir o arquivo no modo somente leitura.

o PERMSargumento especifica as permissões de arquivo para o arquivo especificado, se ele tiver que ser criado. Por padrão, leva0x666.

A seguir está a tabela, que fornece os valores possíveis de MODE.

Sr. Não. Entidades e definição
1

O_RDWR

Leia e escreva

2

O_RDONLY

Somente leitura

3

O_WRONLY

Somente escrita

4

O_CREAT

Crie o arquivo

5

O_APPEND

Anexar o arquivo

6

O_TRUNC

Truncar o arquivo

7

O_EXCL

Pára se o arquivo já existe

8

O_NONBLOCK

Usabilidade sem bloqueio

Fechar Função

Para fechar um filehandle e, portanto, desassociar o filehandle do arquivo correspondente, você usa o closefunção. Isso esvazia os buffers do manipulador de arquivos e fecha o descritor de arquivo do sistema.

close FILEHANDLE
close

Se nenhum FILEHANDLE for especificado, ele fecha o filehandle atualmente selecionado. Ele retorna verdadeiro apenas se conseguir liberar os buffers e fechar o arquivo.

close(DATA) || die "Couldn't close file properly";

Ler e gravar arquivos

Depois de abrir um filehandle, você precisa ser capaz de ler e gravar informações. Existem várias maneiras diferentes de ler e gravar dados no arquivo.

O operador <FILEHANDL>

O principal método de leitura das informações de um filehandle aberto é o operador <FILEHANDLE>. Em um contexto escalar, ele retorna uma única linha do filehandle. Por exemplo -

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

Quando você usa o operador <FILEHANDLE> em um contexto de lista, ele retorna uma lista de linhas do filehandle especificado. Por exemplo, para importar todas as linhas de um arquivo para uma matriz -

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

Função getc

A função getc retorna um único caractere do FILEHANDLE especificado ou STDIN se nenhum for especificado -

getc FILEHANDLE
getc

Se houver um erro ou se o filehandle estiver no final do arquivo, undef é retornado.

ler função

A função read lê um bloco de informações do filehandle em buffer: Esta função é usada para ler dados binários do arquivo.

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

O comprimento dos dados lidos é definido por LENGTH e os dados são colocados no início de SCALAR se nenhum OFFSET for especificado. Caso contrário, os dados são colocados após os bytes OFFSET em SCALAR. A função retorna o número de bytes lidos em caso de sucesso, zero no final do arquivo ou undef se houver um erro.

função de impressão

Para todos os diferentes métodos usados ​​para ler informações de filehandles, a função principal para escrever informações de volta é a função de impressão.

print FILEHANDLE LIST
print LIST
print

A função de impressão imprime o valor avaliado de LIST para FILEHANDLE ou para o arquivo de saída atual (STDOUT por padrão). Por exemplo -

print "Hello World!\n";

Copiando arquivos

Aqui está o exemplo, que abre um arquivo existente file1.txt e lê-o linha por linha e gera outro arquivo de cópia 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 );

Renomeando um arquivo

Aqui está um exemplo, que mostra como podemos renomear um arquivo file1.txt para file2.txt. Assumindo que o arquivo está disponível no diretório / usr / test.

#!/usr/bin/perl

rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );

Esta função renames recebe dois argumentos e apenas renomeia o arquivo existente.

Excluindo um Arquivo Existente

Aqui está um exemplo, que mostra como excluir um arquivo file1.txt usando o unlink função.

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

Posicionamento dentro de um arquivo

Você pode usar para tell função para saber a posição atual de um arquivo e seek função para apontar uma posição particular dentro do arquivo.

conta a função

O primeiro requisito é encontrar a sua posição dentro de um arquivo, o que você faz usando a função tell -

tell FILEHANDLE
tell

Isso retorna a posição do ponteiro do arquivo, em bytes, dentro de FILEHANDLE se especificado, ou o identificador de arquivo selecionado padrão atual se nenhum for especificado.

função de busca

A função de busca posiciona o ponteiro do arquivo para o número especificado de bytes dentro de um arquivo -

seek FILEHANDLE, POSITION, WHENCE

A função usa a função do sistema fseek, e você tem a mesma capacidade de posicionar em relação a três pontos diferentes: o início, o fim e a posição atual. Você faz isso especificando um valor para WHENCE.

Zero define o posicionamento em relação ao início do arquivo. Por exemplo, a linha define o ponteiro do arquivo para o 256º byte no arquivo.

seek DATA, 256, 0;

Informação do arquivo

Você pode testar certos recursos muito rapidamente dentro do Perl usando uma série de operadores de teste conhecidos coletivamente como testes -X. Por exemplo, para realizar um teste rápido das várias permissões em um arquivo, você pode usar um 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";
}

Aqui está a lista de recursos, que você pode verificar para um arquivo ou diretório -

Sr. Não. Operador e definição
1

-A

Hora de início do script menos hora do último acesso ao arquivo, em dias.

2

-B

É um arquivo binário?

3

-C

Horário de início do script menos o tempo de alteração do último inode do arquivo, em dias.

3

-M

Hora de início do script menos a hora de modificação do arquivo, em dias.

4

-O

O arquivo pertence ao ID de usuário real?

5

-R

O arquivo pode ser lido pelo ID de usuário real ou grupo real?

6

-S

O arquivo é um soquete?

7

-T

É um arquivo de texto?

8

-W

O arquivo pode ser gravado pelo ID do usuário real ou pelo grupo real?

9

-X

O arquivo é executável pelo ID de usuário real ou grupo real?

10

-b

É um arquivo especial de bloco?

11

-c

É um arquivo especial de caracteres?

12

-d

O arquivo é um diretório?

13

-e

O arquivo existe?

14

-f

É um arquivo simples?

15

-g

O arquivo tem o bit setgid definido?

16

-k

O arquivo tem o bit sticky definido?

17

-l

O arquivo é um link simbólico?

18

-o

O arquivo pertence ao ID de usuário efetivo?

19

-p

O arquivo é um pipe nomeado?

20

-r

O arquivo pode ser lido pelo usuário efetivo ou ID de grupo?

21

-s

Retorna o tamanho do arquivo, tamanho zero = arquivo vazio.

22

-t

O filehandle é aberto por um TTY (terminal)?

23

-u

O arquivo tem o bit setuid definido?

24

-w

O arquivo pode ser gravado pelo usuário efetivo ou ID de grupo?

25

-x

O arquivo pode ser executado pelo usuário efetivo ou ID de grupo?

26

-z

O tamanho do arquivo é zero?