Trabalhando com arquivos em Perl (parte 2)

Publicado por C00L3R_ em 06/11/2008

[ Hits: 14.966 ]

Blog: https://github.com/CoolerVoid

 


Trabalhando com arquivos em Perl (parte 2)



Continuando o artigo Trabalhando com arquivos no Perl, aqui estarei mostrando como ler conteúdo de diretórios, remover árvores de diretórios em massa, copiar, renomear etc.

Vamos iniciar lendo o conteúdo de um arquivo local:

#!/usr/bin/perl
use File::Basename;
print "analisando local\n";
@list = <*>;
@list = glob("*");
foreach (@list) {
print "$_\n";
}

Pegamos dados do usuário:

print "Qual diretório deseja ver arquivos em perl \?\n";
chomp($arquivo=<STDIN>);

Abrindo um diretório e analisando seu conteúdo:

opendir(DIR, $arquivo);

Aqui pegamos os dados de dentro de um diretório de forma simples, se quisermos retirar apenas arquivos em "Perl", usaremos com uma regex simples "@files = grep { /\.pl$/ } readdir(DIR);", desta forma dentro do array ficarão apenas os arquivos com extensão ".pl", mas no exemplo vamos listar todos os elementos do diretório escolhido pelo usuário.

@files = readdir(DIR);

Usamos sort para organizar por ordem alfabética.

@alfa=sort(@files);
closedir(DIR);
foreach (@alfa) { print "$_\n"; }

Bacana, também podemos usar para renomear um array de arquivos inteiros:

foreach $file (@NAMES) {
   my $newname = $file;
   change $newname
   rename($file, $newname) or warn "não foi possível renomear  $file para $newname: $!\n";
}

Outra coisa interessante seria fazer o Perl nos dizer o que é diretório e o que não é usando basename:

use File::Basename;
$path = '/home/Cooler/ola.pl';
$file = basename($path);
$dir = dirname($path);
print "é diretório $dir, é arquivo $file\n";

Outra coisa bacana para se usar, por exemplo, você tem que remover um diretório e os arquivos dentro, tipo o comando do Unix "rm -r", só que em Perl. Daí podemos fazer:

#!/usr/bin/perl
use File::Find qw(finddepth);
print "Qual pasta a ser deletada todo conteúdo dela sera deletado também\n";
chomp($pasta=<STDIN>);
*name = *File::Find::name;
finddepth \&killer, $pasta;
sub killer {
   if (!-l && -d _) {
      print "rmdir $name\n";
      rmdir($name)  or warn "não foi possível remover diretório $name: $!";
   }
   else {
      print "unlink $name";
      unlink($name) or warn "não foi possível remover arquivo $name: $!";
  
   }
}

Vamos para outro exemplo mais simples e com a mesma função do anterior (remover):

use File::Path;
print "Qual diretório para remover \?\n"; chomp($pasta=<STDIN>);
   foreach $dir ($pasta) {
   rmtree($dir);
}

Agora só faltou o copy, vou dar um exemplo de uso dele:

use File::Copy;
copy("datafile.dat", "datafile.bak") or die "falha na copia: $!";
move("datafile.new", "datafile.dat") or die "falha na copia: $!";

Ele apenas copia um arquivo, você também pode usar outras funções.

Bem fico com o tutorial por aqui, espero ter ajudado pessoal aí do boteco.

Outras dicas deste autor

Iniciando na linguagem Perl

Leitura recomendada

Corrigindo problema do OpenVPN no Ubuntu 10.04

Ativando o Compiz no Fedora MATE + Compiz

A arquitetura WAP - Conceitos gerais

PostgreSQL 8.x (RHEL e Fedora)

DDOS utilizando hubs p2p

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts