[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