[Triangulo-pm] Exemplo: Copiando arquivos

Adriano Ferreira a.r.ferreira em gmail.com
Terça Fevereiro 13 03:27:38 PST 2007


Olá, Pessoal.

Depois de uma longa ausência, estou aqui de volta para fazer algum
tráfego nesta lista que, quem sabe, vira grupo de desenvolvedores Perl
algum dia.

O exemplo desta mensagem é bem curto e simples. Copiar arquivos
através de um shell (ou interpretador de comandos) é uma coisa
rotineira e simples.

> copy source target                   (para cmd.exe em Windows)
$ cp source target                       # para sistemas *nix

Dentro de uma aplicação Perl, a cópia de arquivos também é muito fácil
de ser feita. Há um módulo chamado File::Copy que é tudo o que
precisamos.

A documentação deste módulo está instalado junto com o seu
interpretador Perl e pode ser vista através do comando

$ perldoc File::Copy

O módulo faz parte da biblioteca padrão que vem com todo interpretador
Perl e portanto não precisa de nenhum procedimento de instalação além
daquele que você já fez para instalar Perl.

O exemplo de script a seguir recebe uma lista de nomes de arquivos
como argumento na linha de comando e faz o backup (cópia) de cada um
deles no diretório "bak".

    #!/usr/bin/perl

    die "Usage: $0 FILE..." unless @ARGV;

    use File::Copy 'cp';

    mkdir 'bak' unless -e 'bak';
    die "'bak' is not a directory" unless -d 'bak';

    for (@ARGV) {
        print STDERR "copying $_... ";
        cp $_, "bak/$_"
           or warn "error: $!";
        print STDERR "ok\n" unless $!;
    }

Este conteúdo está no arquivo em anexo, "bak.pl". Na hora de usar, basta fazer

> perl bak.pl file1 file2

e o diretório "bak/" será criado no diretório corrente se não existir
e os arquivos dados como argumentos serão copiados para lá.

Há algumas diferenças entre usar um shell e o interpretador de
comandos Windows. Por exemplo,

$ perl bak.pl *.txt

funciona bem em um shell que fará a expansão do glob "*.txt" para nós.
Mas em Windows,

> perl bak.pl *.txt
copying *.txt... error: No such file or directory at bak.pl line 12.

No entanto, é muito fácil fazer uma pequena modificação neste programa
e fazer a expansão do glob no próprio programa Perl, tornando o script
ainda mais portável.

Alguém se arrisca a sugerir uma modificação para fazer isto?

Adriano Ferreira.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bak.pl
Type: application/octet-stream
Size: 290 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/triangulo-pm/attachments/20070213/2cb0902d/attachment.obj 


Mais detalhes sobre a lista de discussão Triangulo-pm