Perl para sysadmins

31
Perl para Administradores de Sistemas Slackshow 2010 Samir Cury – Rio Perl Monks

Transcript of Perl para sysadmins

Page 1: Perl para sysadmins

Perl para Administradores de Sistemas

Slackshow 2010Samir Cury – Rio Perl Monks

Page 2: Perl para sysadmins

Caracteristicas principais do Perl • Licensa

o GPLv1, 2 ou 3o Artística! (exemplo no slide a seguir)

– "A vida imita o Perl"• TIMTOWTDI!

o "There Is More Than One Way To Do It"• Vantagens e desvantagens

o Geralmente o Perl não te salva de você mesmo Embora o Strict e o Warnings ajudem =)

o Diversão dos programadoreso Como fica o gerente de projeto ?

• Para a tranquilidade dos gerentes :o Bem como na vida, Formalidade pode e deve ser usada,

tudo depende do escopo

o

Page 3: Perl para sysadmins

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

Page 4: Perl para sysadmins

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

o 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";

Page 5: Perl para sysadmins

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 herejust to test a scriptDarkstar ~ # perl -nlpe's/writing/laughing/ or s/script/one\-liner/g' teste.txtI am laughing herejust to test a one-liner

Page 6: Perl para sysadmins

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”:

Page 7: Perl para sysadmins

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

Page 8: Perl para sysadmins

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

Page 9: Perl para sysadmins

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};

Page 10: Perl para sysadmins

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

Page 11: Perl para sysadmins

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>) {

}

Page 12: Perl para sysadmins

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

Page 13: Perl para sysadmins

Say

Basicamente print “$Input /n” ;

Acreditem, faz bastante diferenca

samir@Darkstar ~ $ perl -E'say "HelloWorld"'HelloWorldsamir@Darkstar ~ $

Page 14: Perl para sysadmins

SmartMatching - Arrays

Operador para matches mais inteligentes

Procurando um valor num array antigamente :

if(grep /$value/, @test) {

<code>

}

Com SmartMatching :

if ($value ~~ @test) {

Code

}

Page 15: Perl para sysadmins

SmartMatching - Hashes

O que já era fácil :

If (exists $hash{$key}) {

<code>

}

Ficou ainda mais

If ($key ~~ %hash){

<code>

}

Page 16: Perl para sysadmins

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

Page 17: Perl para sysadmins

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

Page 18: Perl para sysadmins

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

Page 19: Perl para sysadmins

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');

Page 20: Perl para sysadmins

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

Page 21: Perl para sysadmins

Instalando um modulo Perl

Abra uma secao qualquer como root

Darkstar ~ # cpan App::RadFiles=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 -- OKRunning make installPrepending /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.pmInstalling /usr/local/share/perl/5.10.0/App/Rad/Help.pmInstalling /usr/local/share/perl/5.10.0/App/Rad/Config.pmInstalling /usr/local/share/perl/5.10.0/App/Rad/Plugin.podInstalling /usr/local/share/perl/5.10.0/App/Rad/Include.pmInstalling /usr/local/share/perl/5.10.0/App/Rad/Exclude.pmInstalling /usr/local/man/man3/App::Rad::Include.3pmInstalling /usr/local/man/man3/App::Rad::Plugin.3pmInstalling /usr/local/man/man3/App::Rad::Exclude.3pmInstalling /usr/local/man/man3/App::Rad.3pmInstalling /usr/local/man/man3/App::Rad::Help.3pmAppending installation info to /usr/lib/perl/5.10/perllocal.pod GARU/App-Rad-1.04.tar.gz /usr/bin/make install -- OK

Page 22: Perl para sysadmins

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/perl5Attempting to create file /home/samir/perl5/.modulebuildrcexport 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"

Page 23: Perl para sysadmins

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!

Page 24: Perl para sysadmins

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

Page 25: Perl para sysadmins

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 3004msrtt min/avg/max/mdev = 11.826/12.543/13.847/0.795 ms

Page 26: Perl para sysadmins

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.txtPING 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 PERL4 packets transmitted, 4 received, 0% packet loss, time 3004msrtt min/avg/max/mdev = 11.826/12.543/13.847/0.795 ms

Page 27: Perl para sysadmins

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

Page 28: Perl para sysadmins

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

Page 29: Perl para sysadmins

Hands on! App::Rad

Page 30: Perl para sysadmins

Yet Another Perl ConferenceYAPC::BR

• Perl – Solucoes e integracoes para negocios!

Fortaleza – 25 a 31 de Outubro

http://www.yapcbrasil.org.br