Trabalhando com arquivos em Perl (parte 2)

Publicado por C00L3R_ em 06/11/2008

[ Hits: 14.967 ]

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

Exercício Prático LPIC 07

Como instalar o TeamSpeak 3 no Ubuntu Linux

Blog dedicado aos estudos LPI nível 1

Instalando o comando sudo no Debian

Instalando o Shibboleth Service Provider (2.3) no Gentoo

  

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