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
por 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

-
- Mensagens: 56
- Registado: Segunda Dez 28, 2009 15:06
por 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

-
- Mensagens: 56
- Registado: Segunda Dez 28, 2009 15:06
por 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

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
por 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-81º hit
http://perldoc.perl.org/functions/glob.htmlNote 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

-
- Mensagens: 56
- Registado: Segunda Dez 28, 2009 15:06
por 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
- 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

-
LuisFilipe
- Membro Diamante

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
por 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
- 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

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

-
- Mensagens: 56
- Registado: Segunda Dez 28, 2009 15:06
por 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

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
por 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

-
- Mensagens: 56
- Registado: Segunda Dez 28, 2009 15:06
por 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

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
por LuisFilipe » Terça Mai 18, 2010 23:17
-
LuisFilipe
- Membro Diamante

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
por 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

-
- Mensagens: 56
- Registado: Segunda Dez 28, 2009 15:06
por 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

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
por 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

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
por 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

-
- Mensagens: 56
- Registado: Segunda Dez 28, 2009 15:06
por 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

-
LuisFilipe
- Membro Diamante

-
- Mensagens: 1270
- Registado: Domingo Set 04, 2005 22:12
Voltar para Programação
Quem está ligado:
Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante