[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