[SP-pm] S.O.S

Luis Motta Campos luismottacampos em yahoo.co.uk
Terça Maio 8 00:54:08 PDT 2007


On May 8, 2007, at 8:33 AM, Daniel Vinciguerra wrote:
> my @teste = system("dir *.jpg");
>
> print("@teste ");
>
> A grosso modo é um exemplo de como poderia ser feito...
> já que não entendi sua pergunta...
>
> Especifique mais oque quer e como está desenvolvendo seu projeto...
> Se possivel mande o codigo em que está com problemas para ficar
> melhor de ser analisado... =)


   Daniel, de todas as soluções possíveis para o problema, você  
escolheu a menos elegante, menos portável, a mais complicada.

   Para usar system(), você precisa garantir que o sistema  
operacional do Sávio é conhecido (e, no seu caso, Janelous - argh!).  
Depois, sempre que você chama um programa com system(), precisa  
lembrar que o programa pode ter problemas para executar e vai setar  
um monte de códigos de erro - que precisam ser tratados, ou vão matar  
um programador louco. Se você não fizer estas coisas, está pedindo  
encrenca, e o Perl vai se vingar de você. ;-)

   Sávio, por favor, se isto é trabalho de escola, eu gostaria de  
saber. Não me incomoda nada ajudar pessoas que não sabem perl, mesmo  
que seja para trabalho de escola. Mas não vou deixar ninguém sair  
daqui se achando espertinho por que fez os "gurus" de Perl da cidade  
de São Paulo escreverem o trabalho da faculdade dele.

   Soluções possíveis, elegantes e simples para o seu problema:

   1. Use File::Find: (o script abaixo foi gerado pelo find2perl,  
fácil e simples de usar).

#! /usr/bin/perl -w
     eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
         if 0; #$running_under_some_shell

use strict;
use File::Find ();

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted {
     my ($dev,$ino,$mode,$nlink,$uid,$gid);

     (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
     -f _ &&
     /^.*\.JPG\z/s
     && print("$name\n");
}

# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '.');
exit;
__END__

   2. Use globs:

   my @jpeg_files = glob( '*.JPG' );

   Isto não é recursivo, você precisa fazer outras vezes para listar  
os demais diretórios.

   3. Use opendir e readdir para ler os diretórios, e encontrar os  
arquivos que você quer. Isto também não é recursivo, e tem a  
desvantagem de precisar de tratamento de erros (diretórios podem dar  
problemas ao serem abertos e fechados, é preciso que o programa saiba  
o que fazer em caso de problemas. E isto também não lê sub diretórios  
recursivamente.

   Leia sobre o opendir e readding nas man-pages do Perl:

   perldoc -f opendir

   perldoc -f readdir

   Espero que isso ajude.
   Putamplexos!
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}




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