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? |