[SP-pm] SaoPaulo-pm Digest, Vol 53, Issue 24

breno breno at rio.pm.org
Fri Feb 27 09:24:44 PST 2009


2009/2/27 Raphael Carpi <raphael.carpi em gmail.com>:
> boa tarde drs.
>

Boa tarde! Não sou doutor mas acho que o cumprimento foi pra mim também :-)

> então senhores achei a lista enquanto estava pesquisando tutorial sobre perl
>
> estou aprendendo perl agora e estou em busca de alguns tutoriais, achei
> vario na net e acho que a lista ajuda em algumas coisas
>

Cuidado com exemplos errados ou jurássicos (e consequentemente errados
tb)! Use a lista quando tiver dúvidas, e tenha certeza que o material
lido refere-se ao Perl 5 (de preferência 5.8 ou 5.10, para ser mais
exato). Pra começar, experimente esse:

http://www.perl.org.br/Perldoc/V500807/Perlintro

Ah, e vc já conhece o CPAN, certo? 90% de todos os seus programas já
estão prontos! :-)

http://search.cpan.org


> a duvida que tenho agora é a seguinte
>
> qual o meio mais rapido de executar o comando num script perl
>
> syste("comando");
>

vc quis dizer system(), eu sei. Typos acontecem :-)

> exec("comando");
>
> `comando`;
>
> sei que as tres formas funcionam mas qual seria a mais rapido ou a mais
> recomendada.
>

Que tal "nenhuma"? Perl é uma linguagem de programação. Se seu
problema resume-se simplesmente a "executar programas externos de
forma rápida", shell scripting (em ambiente *nix) e batch files (em
ambiente win*) são mais apropriados, emho :-)

Agora, se o buraco é mais embaixo e vc precisa fazer o parsing da
saída ou controle externo de programas, Perl será provavelmente sua
melhor amiga. Não se preocupe com velocidade - Perl é bastante rápido
- preocupe-se com qual das opções melhor atende o seu problema.
Garanto que o gargalo da aplicação (se houver) será no parsing em si,
e não nos microsegundos que vc ganhou/perdeu chamando exec() ou
system() - "desenvolva agora, otimize depois", já diz o ditado. E o
módulo Devel::NYTProf pode te ajudar muito nisso, uma vez que seu
programa estiver completo.

Sobre as diferentes abordagens de system, etc, cada uma das opções
listadas tem suas particularidades e propósitos específicos, não
havendo uma "melhor que a outra" (depende do seu problema!). Para mais
informações sobre elas, digite:

perldoc -f system
perldoc -f exec

Uma dica que posso te dar sobre boas práticas na execução de programas
externos é: Se vc realmente tem q fazer, coloque o programa e seus
parâmetros numa lista. Isto é:

em vez de:

system("meuprog --arg1 --arg2");

faça:

system( "meuprog", "--arg1", "--arg2");

ou, mais especificamente:

my @cmd = ('meuprog', '--arg1', '--arg2');
system (@cmd);

O motivo é que, dessa forma, o Perl garante que o primeiro elemento da
lista é o programa a ser chamado e que os demais elementos serão
passados como parâmetros para ele. Isso elimina um monte de problemas
de segurança associados à execução de programas com nome/parâmetros
passados pelo usuário, especialmente em relação à interpolação de
metacaracteres shell.

Apenas por diversão, fiz o seguinte benchmark:

----------------------------8<----------------------------
use Benchmark qw(:all);

cmpthese(100000, {
        'exec'   => sub { exec 'bla'   },
        'system' => sub { system 'bla' },
        'qx'     => sub { qx{bla}      },
        'plique' => sub { `bla`        },
});
----------------------------8<----------------------------

obtendo os resultados:

          Rate system plique     qx   exec
system  1950/s     --   -12%   -12%   -96%
plique  2216/s    14%     --    -0%   -96%
qx      2225/s    14%     0%     --   -96%
exec   50000/s  2464%  2156%  2147%     --


É isso. Qualquer dúvida, como o champs falou, lembre-se de usar e
abusar da lista!

[]s

-b


More information about the SaoPaulo-pm mailing list