2. Caracteristicas principais do Perl Licensa GPLv1, 2 ou 3 Artística! (exemplo no slide a seguir) "A vida imita o Perl" TIMTOWTDI! "There Is More Than One Way To Do It" Vantagens e desvantagens Geralmente o Perl não te salva de você mesmo Embora o Strict e o Warnings ajudem =) Diversão dos programadores Como fica o gerente de projeto ? Para a tranquilidade dos gerentes : Bem como na vida, Formalidade pode e deve ser usada, tudo depende do escopo
3. As faces do Perl - desmistificando Linguagem exclusiva para web antiga, scripts e a favorita dos sysadmins e hackers que nao tem paciencia para C. Em parte verdade #### Linux Merry Christmas by SmokeMachine### perl -e'*MERRY=*\;*XMAS=*/;' -F: -nae'$,=join q,,,map{chr$_+@{[(1)x unpack q C\CC,q q \q \q q]}}q 1007769828289001 =~/.{2}/g;BEGIN{*SANTA = *ARGV}$MERRY=$XMAS;print$F[0],join q,,,map{chr}q;099104114105115116109097115;=~/(.{3})/g;BEGIN{push@SANTA,join q,,,map{chr}q 30471011160990471120971151151191003 =~/(.{3})/g}' http://tinyurl.com/26owg37
4. As faces do Perl - desmistificando O que muita gente nao sabe, ou ate mesmo nao aceita, e que Perl tambem pode ser bem formal, caso voce queira Ele nao te amarra e nem te obriga E uma escolha livre. #!/usr/bin/perl use Employee; my $object = new Employee( "Mohammad", "Saleem",23234345); # Get first name which is set using constructor. my $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n"; # Now Set first name using helper function. $object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "After Setting First Name is : $firstName\n";
5. Mais faces – diversão / “prototipagem” / Na verdade, o Perl pode assumir qualquer forma entre o punk e o engravatado, voce e livre para faze-lo, e por isso deve ter a responsabilidade de saber o que faz e onde faz, lembre-se : tudo tem seu uso Quando quiser testar algum trecho rapido de codigo que esta em duvida sobre, ou executar tarefas simples, nada melhor que um one-liner : Darkstar ~ # cat teste.txt I am writing here just to test a script Darkstar ~ # perl -nlpe's/writing/laughing/ or s/script/one\-liner/g' teste.txt I am laughing here just to test a one-liner
6. Diversos Frameworks / Utilidades WEB Catalyst – famoso, grande e mais adotado Mojolicious – Feito para aplicações pequenas, leves e rápidas para escrever. Command Line App::Rad Acesso a DB DBI – Database Interface DBIx::Class – é possível usar um DB, “sem usar SQL”:
7. Exemplo - DBIx::Class ################ Arquivo da classe Schema::Result::Artist ############ package MyDB::Schema::Result::Artist; use base qw/DBIx::Class::Core/; __PACKAGE__->table('artist'); __PACKAGE__->add_columns(qw/ artistid name /); __PACKAGE__->set_primary_key('artistid'); 1; ############### Arquivo do seu código: ################## Use MyDB::Schema::Result::Artist; my $schema = MyDB::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params); $schema->table('artist'); #SELECT * FROM Artist my @all_artists = $schema->resultset('Artist')->all; #SELECT * FROM Artist WHERE name LIKE 'John%' my $johns_rs = $schema->resultset('Artist')->search( # Build your WHERE using an SQL::Abstract structure: { name => { like => 'John%' } } ); Para quem quiser mais : http://www.slideshare.net/jshirley/demystifying-dbixclass
8. A linguagem Tipos de variavel (A.K.A. Contexto) $scalar; # pode ser “a”, ou ' http://url.com ' , ou 1 ou 0 ou undef #Tipo de unidade mais primitiva @array = qw[ a b c d e] ; # (“a”, 'http://url.com', 1 , 0 ), simplesmente lista de escalares %Hash = ( nome => 'Samir', endereco => 'Rua Local Host, 127.0.0.1', ); Perldoc Perldata http://perldoc.perl.org/perldata.html
9. Acessando as variaveis Array é uma lista de escalares Então, para acessar o segundo valor : my $scalar = $array[2]; O Hash é um array associativo chave => valor Para acessar o valor de 'chave' : my $scalar = $hash{chave};
10. Problema Para array e para hash, eu só posso ter como valores, escalares, mas eu quero passar um hash ou um array como valor, e agora? Referências! $array1[3] = \@array; $hash{'array'} = \@array; Depois eu posso “restaurar” este valor para um escalar e trabalhar com ele : my $arref = $array1[3]; $arref->[0]; Foreach my $value (@$arref){ <code> } Ou posso dereferenciar : my $arref = $array1[3]; my @array = @$arref; #exemplo legal de mudanca de #contexto
11. Estruturas de loop .. interessantes Foreach my $row (@array) { print $row; } #ou Foreach (@array) { Print $_.”\n “; } for (1..100) { say $_; #suportado no Perl >= 5.10 } while (<FILEHANDLER>) { }
12. Inovações do Perl 5.10 Existem muitas outras, mas aqui será útil Say SmartMatch Para os curiosos / interessados : http://www.slideshare.net/rjbs/perl-510-for-people-who-arent-totally-insane
13. Say Basicamente print “$Input /n” ; Acreditem, faz bastante diferenca samir@Darkstar ~ $ perl -E'say "HelloWorld"' HelloWorld samir@Darkstar ~ $
14. SmartMatching - Arrays Operador para matches mais inteligentes Procurando um valor num array antigamente : if(grep /$value/, @test) { <code> } Com SmartMatching : if ($value ~~ @test) { Code }
15. SmartMatching - Hashes O que já era fácil : If (exists $hash{$key}) { <code> } Ficou ainda mais If ($key ~~ %hash){ <code> }
16. Variáveis especiais – não mordem $_ - entrada padrão (para subs e regexps) %ENV – Ambiente da sua sessão (env do bash por exemplo) $^O – Sistema operacional $/ - “\n” - só que mais fácil @_ - Argumentos de uma sub (padrão para shift()) @ARGV – Argumentos para o seu script $$ - PID do seu processo rodando $. - Numero da linha que está sendo lida agora do <FileHandle> Elas te ajudam a escrever testes rápidos, porém não são tão legíveis, obviamente
17. Variáveis especiais – ainda com medo? Use English; $_ - $ARG $^O – $OSNAME $/ - “\n” - $INPUT_RECORD_SEPARATOR ou $RS @_ - @ARG $$ - $PROCESS_ID ou $PID $. - $INPUT_LINE_NUMBER ou $NR
18. CPAN – O poder do Perl O repositório de módulos Perl http://search.cpan.org Onde 90% dos seus problemas já estão resolvidos Monitoramento de uma grandeza qualquer via gráficos (com histórico) RRD::Simple Ler arquivos de configuração Config::Simple Ler um XML e passar chave => valor para um hash? (suporta árvores) XML::Simple Usar uma tabela do google (APIs AJAX) para saida via web : Data::Google::Visualization::DataTable O que mais voce precisar Procure la e provavelmente ira achar
19. Update pre-palestra! Net::Twitter::Lite Use Net::Twitter::Lite my $net_twitter = Net::Twitter::Lite->new( username => $user, password => $password ); $net_twitter->update('Twittando via Perl no Slackshow');
20. NameSpaces Lembram que o modulo para RRDs era RRD::Simple e para XMLs era XML:: Chamamos isto de NameSpace Uma boa pratica, e se voce desenvolve um modulo, deixar sob um namespace que faca sentido NamesPace para modulos “zoados” => ACME:: Vamos para o browser, alguns modulos interessantes, inclusive um que originou a camisa da Rio Perl Monks
21. Instalando um modulo Perl Abra uma secao qualquer como root Darkstar ~ # cpan App::Rad Files=27, Tests=174, 4 wallclock secs ( 0.16 usr 0.06 sys + 3.07 cusr 0.49 csys = 3.78 CPU) Result: PASS GARU/App-Rad-1.04.tar.gz /usr/bin/make test -- OK Running make install Prepending /root/.cpan/build/App-Rad-1.04-smkdfB/blib/arch /root/.cpan/build/App-Rad-1.04-smkdfB/blib/lib to PERL5LIB for 'install' Installing /usr/local/share/perl/5.10.0/App/Rad.pm Installing /usr/local/share/perl/5.10.0/App/Rad/Help.pm Installing /usr/local/share/perl/5.10.0/App/Rad/Config.pm Installing /usr/local/share/perl/5.10.0/App/Rad/Plugin.pod Installing /usr/local/share/perl/5.10.0/App/Rad/Include.pm Installing /usr/local/share/perl/5.10.0/App/Rad/Exclude.pm Installing /usr/local/man/man3/App::Rad::Include.3pm Installing /usr/local/man/man3/App::Rad::Plugin.3pm Installing /usr/local/man/man3/App::Rad::Exclude.3pm Installing /usr/local/man/man3/App::Rad.3pm Installing /usr/local/man/man3/App::Rad::Help.3pm Appending installation info to /usr/lib/perl/5.10/perllocal.pod GARU/App-Rad-1.04.tar.gz /usr/bin/make install -- OK
22. local::lib – Instale tudo no seu Home! #cpan local::lib Depois que tudo for bem : \ Eu precisei (talvez voces nao) $cpan >o conf read # (ver aqui se tem alguma variavel configurada para o home do root) >o conf prefs_dir /home/samir/.cpan/prefs >o conf commit samir@Darkstar ~ $ perl -Mlocal::lib Attempting to create directory /home/samir/perl5 Attempting to create file /home/samir/perl5/.modulebuildrc export MODULEBUILDRC="/home/samir/perl5/.modulebuildrc" export PERL_MM_OPT="INSTALL_BASE=/home/samir/perl5" export PERL5LIB="/home/samir/perl5/lib/perl5/i486-linux-gnu-thread-multi:/home/samir/perl5/lib/perl5" export PATH="/home/samir/perl5/bin:$PATH"
23. Perldoc – sua fonte de referencias Se estiver perdido sobre qualquer coisa em Perl, geralmente a documentacao esta a um comando de distancia! #perldoc perlvar #perldoc perlreftut #perldoc perlboot #perldoc -f print E muito mais! WARNING – em muitas distros perldoc e um pacote separado que deve ser instalado!
24. Um pouco mais de one-liners Proposito (nao e grandioso) Por isso se torna bom – rapido e sujo, para tarefas temporarias, com o poder de uma linguagem e suas libs. Aprendendo helloworld em one-liners #perl -e'print “helloworld \n”' #perl -E'say “helloworld”' Aprendendo muito mais do que isto : #perldoc perlrun
25. Arquivo cobaia samir@Darkstar ~ $ cat perl.txt PING google.com (64.233.163.104) 56(84) bytes of data. 64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_seq=4 ttl=54 time=12.5 ms --- google.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 11.826/12.543/13.847/0.795 ms
26. Flags interessantes -ne -npe – imprime o que esta em $_ while (<>) { ... #seu codigo aqui } samir@Darkstar ~ $ perl -ne'print $_ if m/^--\w*/ ' perl.txt --- google.com ping statistics --- samir@Darkstar ~ $ perl -npe's/^--.*/SUBSTITUI AQUI COM O PERL/' perl.txt PING google.com (64.233.163.104) 56(84) bytes of data. 64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_seq=4 ttl=54 time=12.5 ms SUBSTITUI AQUI COM O PERL 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 11.826/12.543/13.847/0.795 ms
27. Flags interessantes -l – Tratamento de newlines Basicamente para cada linha do arquivo sendo lido, remove \n ao final Ao imprimir de volta, recoloca o \n (caso voce nao queira dados sujos) Deve ser usado com -n ou -p
28. Casos de uso de one-liners Yum log watch Surgiu de uma Regexp que veio de uma ideia legal Ate 2011 vai virar um projeto GPL Ja existe um esqueleto de codigo Temperature Ferramenta que e o exemplo perfeito de um framework para desenvolvimento de aplicativos de linha de comando – App::Rad
30. Yet Another Perl Conference YAPC::BR Perl – Solucoes e integracoes para negocios! Fortaleza – 25 a 31 de Outubro http://www.yapcbrasil.org.br