Ir para conteúdo
Fórum Script Brasil

Fvox

Membros
  • Total de itens

    97
  • Registro em

  • Última visita

Tudo que Fvox postou

  1. Meu caro, isso não é uma dúvida, é um trabalho. Dica: contrate um freelancer. []'s
  2. Hi. Gabriel, o Perl possui n soluções para resolver o teu problema, mas você está buscando uma solução com um certo nível de complexidade, logo precisará de algum pouco conhecimento da linguagem. Eu te recomendaria utilizar o módulo Daemon::Generic, um framework para criação de daemons que já implementa comandos start/stop/version/restart/reload e etc, controle de PID, mensagem de help e etc. Basta criar um módulo com métodos "gd_preconfig()", "gd_run()", e etc. A documentação no CPAN será sua amiga! Na execução do daemon, você precisará ficar listando o diretório sem parar, certo? Para estas tarefas eu gosto muito de utilizar o timer() do AnyEvent, um framework de event loop que você ainda vai ouvir falar muito ao mexer com Perl. Para o log, você pode utilizar o Log::Log4perl no modo easy para implementar as principais funções de debug(), error(), etc. Olha, são duas e meia da manhã e estou suave, tomando um café. Então vou criar um esqueleto para que você possa entender melhor como eu o faria: #!/usr/bin/env perl package MeuDaemon; use strict; use warnings q(all); use FindBin qw($RealBin $Script); use AnyEvent; use Daemon::Generic; use Log::Log4perl qw(:easy); newdaemon( progname => $Script, pidfile => "$RealBin/$Script.pid" ); sub gd_preconfig { Log::Log4perl->easy_init({ level => $DEBUG, file => "STDOUT", #file => "$RealBin/$Script.log", }); return (); } sub gd_run { my $self = shift; my $cv = AnyEvent->condvar; my $w = AnyEvent->timer( after => 0.0, interval => 1.0, cb => sub { INFO "Buscando arquivos no diretorio..."; my @files = glob("/home/fvox/filesToProc/*"); for my $file (@files) { DEBUG "Processando ${file}..."; } INFO "Fim do processo!"; }, ); $cv->wait; } 1;Execução: O script já funciona em loop, buscando arquivos no diretório a cada 1 segundo. O AnyEvent cai como uma luva para se trabalhar com I/O non blocking: isto implica que o processo, enquanto ficar em espera, não consumirá 100% dos clocks da CPU. =p Agora cabe a você personalizar e otimizar o teu daemon, como por exemplo, dividindo a lista de arquivos encontrados numa queue de forks. Claro que o CPAN te oferece zilhões de opções de módulos para fazer essas tarefas que você precisa e nos exemplos que criei foram utilizados módulos do meu gosto particular. =p Espero que eu tenha ajudado. E boa sorte no desenvolvimento! ;-) []'s
  3. Fvox

    Conexão WEB

    Hi. Há uma infinidade de libs pra trabalhar com http. Uma boa introdução é este tutorial: http://são-paulo.pm.org/artigo/2010/utiliz...criarwebspiders Vale lembrar de o Facebook, por exemplo, possui toda uma API pra integração e é válido procurar um módulo pra se trabalhar com ela. ;-)) []'s
  4. Fvox

    Prompt abre e fecha

    Hi. Tá usando Windows e abrindo com dois cliques, né? Ué, o programa fez o que você mandou. Executou a rotina e terminou. Se quiser colocar uma "pausa" pra digitar um caractere antes de fechar, termine o código com um: <STDIN>; []'s
  5. Fvox

    Ajuda

    Hi. O ideal é modelar o algoritmo pra executar a ação fora e dentro do while. Mas, dá pra fazer um XGH e usar o "last" pra sair do while caso a opção seja igual a "-1". Algo tipo isso: #!/usr/bin/env perl use strict; use warnings; use feature qw(say); my $number1l = 0; my $number2q = 0; my $m1 = 0; while ($number1l != "-1") { say "Digite os litros usados (-1 para fim):"; chomp ($number1l = <STDIN>); last if $number1l eq '-1'; say "Digite os quilômetros dirigidos:"; chomp ($number2q = <STDIN>); $m1 = $number2q / $number1l; say "Os quilômetros/litro para esse tanque foram: " . $m1; } say "Média total:\n$m1"; []'s
  6. Hi. Tenho um que fiz há algum tempo que implementa um cachezinho numa hashref estática. Não é nada mas fica muito mais rápido que a implementação comum: use strict; use warnings; use feature qw(say state); sub fib { state $m = { 1 => 1, 2 => 1, }; return $m->{$_[0]} //= fib($_[0] - 1) + fib($_[0] - 2); } say fib 45; []'s
  7. Fvox

    Hello World no prompt

    Hi. Amigo, aspas simples (\x27) são diferentes deste caractere de quotes que você está usando que parece um acento mas não é (\xe2\x80\x99). Funcionará se você utilizar simple quotes de verdade: perl -e 'print "Hello World!\n";' []'s
  8. #!/usr/bin/env perl use strict; use warnings; use feature 'say'; use Archive::Zip qw(:ERROR_CODES); my $zip = Archive::Zip->new; if($zip->read('Downloads/51940-51940.ZIP') == AZ_OK) { my @files = (); push @files, $_->fileName for $zip->members(); say 'Quantidade de arquivos: ' . scalar @files; } else { say 'Não foi possível ler o arquivo zip informado!'; } []'s
  9. Fvox

    Dúvida de iniciante

    Hi. Sei que a dúvida já foi resolvida, mas vale deixar a nível de conhecimento que para setar o diretório dos módulos do Perl, devemos inserir o path no array @INC [perlvar at perldoc]. []'s
  10. Hi. Você pode resolver isso com expressões regulares... chomp(my $in = <STDIN>); if($in =~ /^\d+$/) { print "O programa deve fazer algo aqui\n"; } else { print "Insira apenas números!\n"; } []'s
  11. Hi. Hmm, tem um mini tutorialzinho lá no site do próprio ActivePerl mesmo. http://community.activestate.com/faq/activ...-and-apache-cgi []'s
  12. Quase todo curso de computação é puramente teórico. Em CC você vai ter uma visão excelente do geral. Cabe exclusivamente à você você ir mais a fundo atrás de conhecimento. Lembre-se que em programação temos uma vasta gama de linguagens por aí. Independente do curso você vai pegar o básico de uma ou duas, mas a escolha da linguagem que você realmente vai aprender é só sua. []'s
  13. This? my @a = split / /, <DATA>; print 'Item 1: ', $a[0], "\n"; print 'Item 2: ', $a[1], "\n"; __DATA__ 12 20 35 50 Output: []'s
  14. Fvox

    função toXml()

    Isso é porque acaba o documento XML "cachorro" e você inicia o "vaca" em seguida. Se colocar apenas o Cachorro, ou apenas a Vaca, é provável que funcionará. Não se coloca dois documentos em um só. []'s
  15. Hmm... Hora de brincar com um pouco de assincronismo então. Há diversos modos de se fazer isso, mas acho que forking é o mais simples. Faremos um script que executará os outros simultaneamente. Lembrando que, por ser simultâneo, não há controle de qual executará primeiro. Todos serão disparados juntos! #!/usr/bin/env perl use strict; use warnings; my @childs = (); my @files = qw(Ouvinte.pl Estação1.pl Estação2.pl Estação3.pl); for(@files) { my $pid = fork; if($pid) { push @childs, $pid; } elsif($pid == 0) { exec $^X . ' ' . $_; exit(0); } else { print "não foi possivel realizar a operacao: $!\n"; } } for(@childs) { waitpid($_, 0); }
  16. Hi. Opa, que bom que deu tudo certo! Seria difícil tentar ajudar sem poder testar a aplicação. oO Tamo aqui pra isso rs. Boa sorte com o projeto aí. ;-) []'s
  17. Hmm, vamos por partes. Não é em todos os espaços, na realidade.Ele quebra a partir do 4° espaço, que foi o limite passado como parâmetro na função split. Acho que isso já responde a pergunta número 2, certo? Mas pera aí, vamos nos aprofundar melhor: for(@{$data}) { local @_ = split /\s+/, $_, 4; p @_; # Continua... } Output: Percebeu que ali no output eu tenho exatamente o que você quer nos primeiros itens do array, mas, o último índice é todo o "resto" que você não queria? O pop faz exatamente isso. Remove o último item do array. Remove o lixo, ficando só o que você realmente quer. Depois de ter "popado" o array, é só dar um "join" e o resultado será exatamente o que você precisa: Uma escalar com o conteúdo desejado. Dando uma simplificada pra você entender melhor: my @data = ('-1 30 -1 9 6 5','-1 33 14 -1 29 33','-1 31 -1 27 32 32','-1 31 -1 -1 33 30',); for my $string (@data) { my @dividido = split /\s+/, $string, 4; pop @dividido; my $result = join ' ', @dividido; print 'Resultado: ' . $result . "\n"; } E é isso aí! Espero que tenha entendido. Desculpe a demora pra responder, mas é que to com pouco tempo livre... Trabalho e faculdade me matam! =( []'s
  18. Eita, que rápido huahuahuah. Tudo bem, cara. Quando precisar de algo, só falar. =) Abraços. []'s
  19. Hi. Não tenho como fazer o teste pra te ajudar melhor, mas vamos lá... Você faz o unpack e joga isso pra escalar $watts, certo? => perldoc - unpack() Tenta jogar o valor do unpack pra um array e depois joga pra uma scalar. my @watts = unpack("S", substr( $newmsg, 6, 2)); $watts = join q(), @watts; []'s
  20. Passa o parâmetro limit pro split. No seu caso, passaríamos 4. A sobra ficaria junta no último item da lista, então, é só dar um pop para remover. A manipulação é só dar um join depois. =) Exemplo: my $data = ['-1 30 -1 9 6 5', '-1 33 14 -1 29 33', '-1 31 -1 27 32 32', '-1 31 -1 -1 33 30', ]; for(@{$data}) { local @_ = split /\s+/, $_, 4; pop @_; print $_ . ' | ' for @_; print "\n"; } Output: []'s
  21. Hi. Yea, está na inicialização da hash. Você define a hash antes do while. Ou seja, ele define, percorre diretórios e arquivos e vai incrementando. Pra resolver isso, basta declarar a hash dentro do primeiro while. while (defined(my $filename = readdir(DIR))) { open (FILE, '<', './' . $dirname . '/' .$filename); my %count_of = (); Mas aí, mano. Dá pra dar uma simplificada boa nesse teu script. Olha só: for(glob('./' . $ARGV[0] . '/*')) { my $count_of = {}; open my $fh, '<', $_; while(<$fh>) { chomp; s/\d+/ /g; s/[^a-zA-Z0-9'áéíóúàãõâêôçü]+/ /g; $count_of->{$_}++ for split /\s+/; } print $_ . ': ' . $count_of->{$_} . "\n" for (sort {$count_of->{$b} <=> $count_of->{$a} } keys %{$count_of}); } Enfim, nada demais... Só substitui por glob e diminui algumas linhas desnecessárias. []'s
  22. Hmm, tendi. O magic_quotes está ativado? De qualquer modo, faz o seguinte: $out = null; var_dump(exec('ls', $out)); var_dump($out); Qual os valores dos vars dumps?
  23. Ah, desculpe. Não tinha visto que você tinha mencionado a diretiva no tópico. Qual a mensagem de erro retornada? []'s
  24. O php.ini tem uma diretiva chamada "disable_functions". Não há nada por lá? []'s
×
×
  • Criar Novo...