[Ajuda]Correcção Codigo Perl

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

[Ajuda]Correcção Codigo Perl

Mensagempor andrebarradas » Terça Mai 18, 2010 12:54

Boas tardes,

Estou a tentar resolver um exercício em que tenho de procurar ficheiros com uma determinada extensão dada por directoria.
O objectivo é que o utilizador dê por linha de comandos a directoria onde quer procurar como primeiro argumento e na segunda e restantes as extensoes
NOTA:Não é necessário ter o . antes de cada extensão.

Aqui está o código que fiz apesar de até agora ele só encontrar no segundo argumento:

Código: Seleccionar todos
#!/usr/bin/perl -w
use strict;

#Verificar se entrou pelo menos 2 argumentos

if (@ARGV < 2) {die("Tem de colocar pelo menos2 argumentos(1ºdir,2º e restantes ext)");}

#Verificar se o primeiro argumento é directoria

if (!-d $ARGV[0]) {die("Primeiro argumento tem de ser directoria");}

#construir filtro com a função glob

my $glob = "*.{$ARGV[1]}";
my @Globarray = glob($glob);

print " @Globarray \n";




O meu problema é se existe alguma forma de na linha onde tem "my $glob = "*.{$ARGV[1]}";" , onde diz $ARGV[1] se aqui dá para em vez de ir buscar somente ao segundo argumento se existe alguma forma de ele ir buscar não só ao segundo argumento mas a partir do segundo argumento para a frente para o utilizador poder colocar quantas extensoes ele pretender.
Se não tiverem a perceber alguma coisa digam para eu puder dar a informação em falta.

Agradeço desde já a quem puder ajudar,

Cumprimentos,
André Barradas
andrebarradas
Aprendiz
Aprendiz
 
Mensagens: 56
Registado: Segunda Dez 28, 2009 15:06

Mensagempor andrebarradas » Terça Mai 18, 2010 17:31

alguem pode ajudar por favor ou conhecem algum forum onde alguem consiga ajudar na parte de programação que possar dizer por favor
andrebarradas
Aprendiz
Aprendiz
 
Mensagens: 56
Registado: Segunda Dez 28, 2009 15:06

Mensagempor LuisFilipe » Terça Mai 18, 2010 18:53

Voçês não sabem inglês, não conhecem o google ou nem sequer procuram ?

google "PERL glob"

http://www.google.com/search?q=PERL+glo ... 8&oe=utf-8

1º hit
http://perldoc.perl.org/functions/glob.html
Note that glob splits its arguments on whitespace and treats each segment as separate pattern. As such, glob("*.c *.h") matches all files with a .c or .h extension. The expression glob(".* *") matchs all files in the current working directory.
portanto dá, basta concatenares os argumentos com espaços.
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor andrebarradas » Terça Mai 18, 2010 19:07

LuisFilipe Escreveu:Voçês não sabem inglês, não conhecem o google ou nem sequer procuram ?

google "PERL glob"

http://www.google.com/search?q=PERL+glo ... 8&oe=utf-8

1º hit
http://perldoc.perl.org/functions/glob.html
Note that glob splits its arguments on whitespace and treats each segment as separate pattern. As such, glob("*.c *.h") matches all files with a .c or .h extension. The expression glob(".* *") matchs all files in the current working directory.
portanto dá, basta concatenares os argumentos com espaços.


pois o problema é que nao sei o numero de argumento que entram, ou seja,nao sei se o utlizador quer procurar uma,duas ou mais extensoes,tas a perceber.Se soubesse o numero de argumentos tambem sabia como fazer,mas o que quero é fazer de forma a dar para o numero de argumentos dados pelo utlizador
andrebarradas
Aprendiz
Aprendiz
 
Mensagens: 56
Registado: Segunda Dez 28, 2009 15:06

Mensagempor LuisFilipe » Terça Mai 18, 2010 19:55

andrebarradas Escreveu:pois o problema é que nao sei o numero de argumento que entram, ou seja,nao sei se o utlizador quer procurar uma,duas ou mais extensoes,tas a perceber.Se soubesse o numero de argumentos tambem sabia como fazer,mas o que quero é fazer de forma a dar para o numero de argumentos dados pelo utlizador
Tu não sabes é ler 8O

Código: Seleccionar todos
if (@ARGV < 2)

lendo...
Se o numero de argumentos indicado pela variável (de sistema) @ARGV for inferior a 2 então blá blá blá

Portanto @ARGV indica o numero de argumentos e eu não estou para aprender (mas devia) PERL para te fazer esta função visto que o PERL não tem FOR mas tem outra forma da fazer a coisa...
Tenho que arranjar um livro disto :roll:
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor andrebarradas » Terça Mai 18, 2010 20:10

LuisFilipe Escreveu:
andrebarradas Escreveu:pois o problema é que nao sei o numero de argumento que entram, ou seja,nao sei se o utlizador quer procurar uma,duas ou mais extensoes,tas a perceber.Se soubesse o numero de argumentos tambem sabia como fazer,mas o que quero é fazer de forma a dar para o numero de argumentos dados pelo utlizador
Tu não sabes é ler 8O

Código: Seleccionar todos
if (@ARGV < 2)

lendo...
Se o numero de argumentos indicado pela variável (de sistema) @ARGV for inferior a 2 então blá blá blá

Portanto @ARGV indica o numero de argumentos e eu não estou para aprender (mas devia) PERL para te fazer esta função visto que o PERL não tem FOR mas tem outra forma da fazer a coisa...
Tenho que arranjar um livro disto :roll:


Se o numero de argumentos for inferior a 2 ele faz um die,ou seja para passar dali tem de ter pelo menos 2 argumentos.Não estou a perceber onde esta a duvida ali.

O perl tem for e foreach
andrebarradas
Aprendiz
Aprendiz
 
Mensagens: 56
Registado: Segunda Dez 28, 2009 15:06

Mensagempor LuisFilipe » Terça Mai 18, 2010 21:24

andrebarradas Escreveu:pois o problema é que nao sei o numero de argumento que entram


andrebarradas Escreveu:Se o numero de argumentos for inferior a 2 ele faz um die,ou seja para passar dali tem de ter pelo menos 2 argumentos.Não estou a perceber onde esta a duvida ali.

???
não sabes quantos argumentos são passados mas o programa verifica se o numero de argumentos passados é menor que 2...

andrebarradas Escreveu:O perl tem for e foreach


Código: Seleccionar todos
if (@ARGV < 2)

@ARGV é igual ao número de argumentos passados pelo utilizador

http://www.cs.tut.fi/~jkorpela/perl/course.html
Código: Seleccionar todos
    if ($#ARGV >= 0) { $who = join(' ', @ARGV); }
    else { $who = 'World'; }
    print "Hello, $who!\n";

ou seja o PERL tem uma forma peculiar de endereçar listas ...

tenta isto
Código: Seleccionar todos
my $glob = join(' ', @ARGV);
my @Globarray = glob($glob);

print " @Globarray \n";

segundo penso $glob = arg0 arg1 ... argN
hehehe
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor andrebarradas » Terça Mai 18, 2010 21:48

omg.......

Mas e assim tao dificil perceber que aquela linha a unica coisa que faz é verifica se entram pelo menos 2 argumentos??

ou não sabes ver a linha a seguir:

if(@ARGV < 2) {DIE("ERRO DE ARGUMENTOS");}

Resumindo:

Se o numero for menor que 2 argumentos significa que ele vai mandar uma mensagem para o ecrã a dizer: Erro de argumentos,ou seja, está a obrigar que entrem no minimo 2 argumentos nao significa que são só 2 argumentos que entram no máximo.Compreendeste agora ou é preciso fazer um desenho?
andrebarradas
Aprendiz
Aprendiz
 
Mensagens: 56
Registado: Segunda Dez 28, 2009 15:06

Mensagempor LuisFilipe » Terça Mai 18, 2010 23:00

andrebarradas Escreveu:omg.......

Mas e assim tao dificil perceber que aquela linha a unica coisa que faz é verifica se entram pelo menos 2 argumentos??

ou não sabes ver a linha a seguir:

if(@ARGV < 2) {DIE("ERRO DE ARGUMENTOS");}

Resumindo:

Se o numero for menor que 2 argumentos significa que ele vai mandar uma mensagem para o ecrã a dizer: Erro de argumentos,ou seja, está a obrigar que entrem no minimo 2 argumentos nao significa que são só 2 argumentos que entram no máximo.Compreendeste agora ou é preciso fazer um desenho?
Vamos lá a ver...

Código: Seleccionar todos
if(@ARGV = 5) {DIE("Foram passados 5 Argumentos");}
if(@ARGV = 4) {DIE("Foram passados 4 Argumentos");}
if(@ARGV = 3) {DIE("Foram passados 3 Argumentos");}
if(@ARGV = 2) {DIE("Foram passados 2 Argumentos");}
if(@ARGV = 1) {DIE("Foram passados 1 Argumentos");}
if(@ARGV = 0) {DIE("Não foram passados Argumentos");}

Certo ?
Portanto se forem passados 6 argumentos passa pelas mortes todas e não para...
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor LuisFilipe » Terça Mai 18, 2010 23:17

OK estou a fazer debug disso :evil: :evil: :evil: :evil: :evil:
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor andrebarradas » Terça Mai 18, 2010 23:19

Nesse caso se forem passados 6 ou mais sim ele continua o programa.
No meu caso significa que tem de passar 2 ou mais,não e preciso escrever 2 if's para =0 e =1 para obrigar a passar 2 argumentos ou mais.Mas o meu problema nem e ai.o meu problema e saber uma funçao que va buscar automaticamente a ultima posiçao do array @ARGV para usar isso na função glob.



O meu programa esta correcto,mas so procura ficheiros para uma extensao.O que quero e que o user possa introduzir as extensoes que ele quiser.Tas a perceber?
andrebarradas
Aprendiz
Aprendiz
 
Mensagens: 56
Registado: Segunda Dez 28, 2009 15:06

Mensagempor LuisFilipe » Terça Mai 18, 2010 23:25

andrebarradas Escreveu:Nesse caso se forem passados 6 ou mais sim ele continua o programa.
No meu caso significa que tem de passar 2 ou mais,não e preciso escrever 2 if's para =0 e =1 para obrigar a passar 2 argumentos ou mais.Mas o meu problema nem e ai.o meu problema e saber uma funçao que va buscar automaticamente a ultima posiçao do array @ARGV para usar isso na função glob.



O meu programa esta correcto,mas so procura ficheiros para uma extensao.O que quero e que o user possa introduzir as extensoes que ele quiser.Tas a perceber?


@ARGV é o # do n. de apontadores

assim o ultimo apontador será
Código: Seleccionar todos
print "{$ARGV[@ARGV-1]} \n";


À bruta (e estou a testar após instalar á pouco a coisa)
junta no fim
Código: Seleccionar todos
if (@ARGV < 3) {die(" ");}
my $glob = "*.{$ARGV[2]}";
my @Globarray = glob($glob);
print " @Globarray \n";

if (@ARGV < 4) {die(" ");}
my $glob = "*.{$ARGV[3]}";
my @Globarray = glob($glob);
print " @Globarray \n";


PS: isto está lento a postar...
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor LuisFilipe » Terça Mai 18, 2010 23:34

Pronto já descobri a variável é
There is a very useful predefined array in Perl @ARGV that contains all the arguments of the script used in the command line. The following code prints out the first three of these arguments:
Código: Seleccionar todos
print "  Argument one: $ARGV[0]\n";
print "  Argument two: $ARGV[1]\n";
print "Argument three: $ARGV[2]\n";

Of course, variable $#ARGV contains the number such argument minus one.
O PERL assume essa variável quando comparas o array @ARGV com um inteiro tipo C++ quando o argumento é um inteiro devolve o cardinal (o total de elementos do array)
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor andrebarradas » Terça Mai 18, 2010 23:35

LuisFilipe Escreveu:
andrebarradas Escreveu:Nesse caso se forem passados 6 ou mais sim ele continua o programa.
No meu caso significa que tem de passar 2 ou mais,não e preciso escrever 2 if's para =0 e =1 para obrigar a passar 2 argumentos ou mais.Mas o meu problema nem e ai.o meu problema e saber uma funçao que va buscar automaticamente a ultima posiçao do array @ARGV para usar isso na função glob.



O meu programa esta correcto,mas so procura ficheiros para uma extensao.O que quero e que o user possa introduzir as extensoes que ele quiser.Tas a perceber?


@ARGV é o # do n. de apontadores

assim o ultimo apontador será
Código: Seleccionar todos
print "{$ARGV[@ARGV-1]} \n";


À bruta (e estou a testar após instalar á pouco a coisa)
junta no fim
Código: Seleccionar todos
if (@ARGV < 3) {die(" ");}
my $glob = "*.{$ARGV[2]}";
my @Globarray = glob($glob);
print " @Globarray \n";

if (@ARGV < 4) {die(" ");}
my $glob = "*.{$ARGV[3]}";
my @Globarray = glob($glob);
print " @Globarray \n";


PS: isto está lento a postar...


Entao mas isto,primeiro nao percebo para que tares a usar aqueles if visto que ja fiz a verificação de argumentos la no primeiro passo.Depois o que esses 2 passos fazem é fazer de forma a que o utilizador possa escolher 3 extensoes para pesquisa de ficheiros.Se fosse para fazer isso bastava concatenar com espaço na linha onde uso o glob.Não estou a perceber como isso faz com que possa ser introduzido o numero de argumentos que o user pretende
andrebarradas
Aprendiz
Aprendiz
 
Mensagens: 56
Registado: Segunda Dez 28, 2009 15:06

Mensagempor LuisFilipe » Quarta Mai 19, 2010 0:00

Código: Seleccionar todos
my $glob = "*.{$ARGV[1]}";
if ($#ARGV == 2) {$glob = "*.{$ARGV[1]} *.{$ARGV[2]}";}
if ($#ARGV == 3) {$glob = "*.{$ARGV[1]} *.{$ARGV[2]} *.{$ARGV[3]}";}

print " $glob \n";
my @Globarray = glob($glob);
print " @Globarray \n";

pffffffffff :roll:
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Próximo

Voltar para Programação

Quem está ligado:

Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante

cron