forked from otaviof/SPPM-Perl_101
-
Notifications
You must be signed in to change notification settings - Fork 1
/
SPPM-Introducao_ao_Perl.txt
1568 lines (1194 loc) · 62.2 KB
/
SPPM-Introducao_ao_Perl.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Introdução ao Perl
~~~~~~~~~~~~~~~~~~
A visão deste curso é dar base para o programador que deseja ter uma visão geral sobre a linguagem Perl. Mostrando as estruturas que a compõe, bem como sua história.
1. Introdução:
Flexível, portável, versátil, e disponível para todos, Perl cresceu de um substituto simples para Shell Scripts, a uma linguagem completa e de propósito geral.
Esta popular, rica em recursos está ganhando ainda mais terreno enquanto adquire mais "features" a cada nova versão ou extensão. Assim como fez o Moose [1], que trouxe uma grande melhora em Orientação a Objetos para o Perl 5, inspirado no Perl 6.
Uma característica particular, porem muito poderosa, do Perl é a sua implementação de bibliotecas com módulos, o qual a fez uma linguagem genuinamente extensível
Com a sua clareza, estrutura lógica e abordagem prática, este guia é ideal para guiar e acompanhar o leitor ao mundo Perl.
[1] http://www.iinteractive.com/moose/
1.1 Conceitos de programação
Para podermos entender quais as bases do Perl, devemos primeiro relembrar alguns conceitos fundamentais de programação:
1.1.1 Linguagem dinâmica
É uma classe de linguagens, com um alto nível de abstração [1], no qual em tempo de execução realizam tarefas que outras linguagens (chamadas "estáticas") fariam em tempo de compilação. Neste comportamento dinâmico, o software poderia incluir/importar novas partes, extender objetos e definições, tudo isso é provido de maneira direta e simples.
[1] Níveis de abstração é uma classificação, relativa ao desenvolvimento de software e a uma linguagem de programação, indicando
Atenção: O termo "linguagem dinâmica" é diferente de "tipagem dinâmica". O primeiro refere-se ao dinamismo em tempo de execução; o segundo, refere-se a validação dos tipos.
Leia mais:
http://en.wikipedia.org/wiki/Dynamic_language
1.1.2 Tipagem dinâmica
Uma linguagem de programação tem tipos dinâmicos (por exemplo: int, char, scalar, array, hash), quando a maioria das verificações de tipos é feita em tempo de execução. Ou seja, os tipos, propriamente ditos, são associados aos valores e não as variáveis.
Exemplos de linguagens com tipos dinâmicos: Groovy, JavaScript, Lisp, Lua, Objective-C, PHP, Perl, Prolog, Python, Ruby, Smalltalk, Tcl.
Tipos dinâmicos vão acusar seus erros em tempo de execução; por exemplo, um valor pode ser um tipo inesperado ou inexistente, ou uma operação errônea (sem sentido) pode ser atribuída a um tipo que não a suporta. Deve ficar evidente que este tipo de situação é _sempre_ causada pelo programador, e em um cenário assim, pode ser um pouco mais trabalhoso encontrar o causador. É uma situação esperada.
Se compararmos as linguagens de Tipagem Dinâmica com as de Tipagem Estática, elas fazem muito menos verificações nos fontes em tempo de compilação, apenas é certificado de que o programa está sintaticamente correto. Verificações em tempo de execução podem potencialmente ser mais sofisticados, porque são utilizadas as informações geradas pela execução do software, em contra-partida, estas verificações são executadas todas as vezes que o software for chamado.
O desenvolvimento em linguagens de Tipos Dinâmicos tem grande auxílio por boas práticas de programação, como por exemplo Testes Unitários (Unit Testing). "Testar" é a chave em desenvolvimento profissional de software, e é particularmente importante nestes casos. Na prática, os testes asseguram a operação correta do seu software de forma muito mais ampla se comparado às estáticas (ou seja, através da verificação de tipos feita pelo compilador).
Saiba mais:
http://en.wikipedia.org/wiki/Dynamic_typing#Dynamic_typing
1.1.3 Sobre os "tempos"
Nos tópicos acima nós citamos os tempos de "Compilação" e de "Execução", é
necessário relembrar o que é feito em cada um deles:
* Tempo de Compilação (Compile-Time) [1]:
Refere-se as operações feitas por um compilador, as necessidades de uma
linguagem de programação que devem ser equivalentes as descritas no código
fonte para que este processo seja executado com sucesso. As operações
executadas em "Compile-Time" geralmente incluem análise sintática, vários
tipos de análises semânticas, etc.
* Tempo de Execução (Run-Time) [2]:
Refere-se ao período enquanto um software está sendo executado, do começo
ao seu fim. Também pode indicar a duração deste período. O termo é
geralmente empregado para contraste de outras fases do desenvolvimento e
uso de um software.
Estes são os dois mais importantes, porem nós ainda temos o "Link Time" [3]
que consiste em:
Refere-se as operações feitas por uma ferramenta que fará a união entre os
elementos que são necessários para que um software seja entregue com
sucesso após o Tempo de Compilação. As operações performadas em "Link
Time" incluem a reunião de endereços externos ao software, vários tipo de
validações para referências cruzadas entre módulos, entre outros.
[1] http://en.wikipedia.org/wiki/Compile_time
[2] http://en.wikipedia.org/wiki/Run_time_(computing)
[3] http://en.wikipedia.org/wiki/Link_time
1.2 Para acompanhar o curso
Este curso é, antes de mais nada, uma introdução prática ao mundo de
desenvolvimento Perl, portanto, os seguintes itens são indispensáveis:
* Editor de Texto competente;
* Browser;
* Interpretador Perl instalado;
* Acesso a internet;
* Acesso a Console;
Também é desejável, ter noções de inglês para leitura técnica. Você vai
perceber ao longo deste material que os melhores documentos estão em inglês, e
que em muitos casos a tradução para "pt_BR" deixa a desejar.
2. História da Linguagem
2.1 Perl 4 e 5
Perl é uma linguagem em evolução, frequentemente é atualizada com suporte para
novas features. Apesar disso, ela ainda é uma linguagem fácil de aprender e
não perdeu suas bases concisas, evoluindo de uma simples ferramenta de
construir scripts para uma completa, no sentido exato da palavra, construtora
de aplicações orientada a objetos [1].
Perl evoluiu de forma paralela, próxima a Internet. Ganhou popularidade nos
seus primeiros dias como uma linguagem para escrever rapidamente scripts
utilitários. Isso era graças ao poderoso processador de textos e familiaridade
para programadores que faziam uso do Sed [2] e Awk [3], nestas duas o Perl era
parcialmente inspirado. Perl estava obviamente relacionada ao C, mas isso
também era uma característica derivada de Lisp. O resultado ganhou
popularidade como uma linguagem para escrever CGIs (server-side) scripts para
Web Servers, novamente, porque as habilidades de lidar com texto e porque era
facilmente manipulável e expressiva. Tudo isso, durante o que foi chamado de
Perl 4.
A quinta versão da linguagem a levou para um novo patamar, principalmente
através dos recursos de Orientação a Objetos [1]. Seguindo a sua filosofia,
Perl preocupou-se primeiramente em ter o recurso funcionando, ao invés de usar
este tempo discutindo a parte ideológica, pois na época haviam grupos de
usuários que se colocavam contra a mudança. A versão 5 marcou a história do
Perl, transformando-a em uma linguagem para escrever aplicações grandes e
sérias, ao invés de scripts simples.
A versão 5.005 começou a trazer suporte a threads [2], porem, somente dentro
do interpretador. Isso trouxe a linguagem para o Windows e outros sistemas
operacionais que não tinham suporte a processos filhos [3], através de uma
emulação de uma chamada "fork" (system-call) [4]. Uma mudança importante para
suportar estas plataformas.
Na versão 5.6, Perl revisou a sua politica de versionamento, para se mais
específica. Em particular, ela adotou o mesmo sistema utilizado pelo GNU/Linux
[5] para versionar. Também nesta mesma versão, Perl introduziu melhorias,
sendo as principais: um suporte melhor aos idiomas (comandos, sintaxe) Unix
sobre o Windows [6] e suporte inicial ao Unicode [7].
A partir da 5.6, suporte experimental às threads ao nível do usuário, ou seja,
para escrever Perl com suporte a esta tecnologia.
Perl 5.8 trouxe melhorias para a implementação de threads do interpretador.
Também trouxe suporte completo para Unicode, suporte para PerlIO [8] e camadas
para "filehandle", hashes restritos como substituto para os pseudo-hashes
[10], melhor gerenciamento dos sinais [11]; mais tarde, melhorou o suporte
para Windows e uma suite de testes com suporte a regressão.
[ 1] http://en.wikipedia.org/wiki/Object-oriented_programming
[ 2] http://en.wikipedia.org/wiki/Thread_(computer_science)
[ 3] http://en.wikipedia.org/wiki/Fork_%28operating_system%29
[ 4] http://en.wikipedia.org/wiki/System_call
[ 5] http://en.wikipedia.org/wiki/Linux_kernel#Version_numbering
[ 6] http://win32.perl.org/wiki/index.php?title=Main_Page
[ 7] http://en.wikipedia.org/wiki/Unicode
[ 8] http://perldoc.perl.org/PerlIO.html
[ 9] http://perldoc.perl.org/FileHandle.html
[10] http://perldesignpatterns.com/?PseudoHash
[11] http://en.wikipedia.org/wiki/Signal_%28computing%29
2.2 Futuro: Perl 6
O futuro é o Perl 6 [1]. O interpretador foi inteiro reescrito, totalmente
Orientado a Objetos, desde suas raízes, bem como a adição da máquina virtual
Parrot [2], local onde o Perl será executado na versão 6. Enquanto o Perl 6 é
radicalmente diferente em seu interior, ele será compatível com a maioria dos
fontes escritos para a versão 5.
Um destaque é o projeto Ponie [3], no qual estão transferindo o suporte ao
Perl 5 para a Parrot, o planejamento é para que seja compatível com o Perl
5.10, ao menos.
[1] http://dev.perl.org/Perl6.
[2] http://www.parrotcode.org
[3] http://www.poniecode.org
2.3 Larry Wall
Perl foi originalmente desenvolvida por Larry Wall [1], um linguista [2]
trabalhando como Sysadmin [3] na NASA [4]. E, no ano de 1987, criou uma
linguagem -- de propósito geral, com foco em scripts Unix -- que transformou o
processamento de texto em uma tarefa _muito_ mais fácil. Desde então, ele
continua a trabalhar no seu projeto e tornou-se um programador mundialmente
conhecido. Atualmente, ele está trabalhando no Perl 6.
[1] http://en.wikipedia.org/wiki/Larry_Wall
[2] http://en.wikipedia.org/wiki/Linguistics
[3] http://en.wikipedia.org/wiki/Systems_administrator
[4] http://en.wikipedia.org/wiki/NASA
3. Quem usa Perl?
A resposta não pode ser mais simples: praticamente todos nós, direta ou
indiretamente.
Perl foi fundamental para o crescimento e estruturação da internet como nós
conhecemos hoje, visto que naquela época eram escassas as ferramentas para
automatizar tarefas com a qualidade e a versatilidade de Perl. Outro fator
importante é que ela nasceu em ambientes unix-like e nunca perdeu esta
intimidade, e por suas qualidades, tornou-se a primeira escolha de quase todos
os Sysadmins.
Se você imaginar neste momento, qual o caminho que os pacotes percorrem da sua
estação até ter acesso a internet, eu posso afirmar -- com certeza -- de que a
sua conexão foi gerenciada ou auxiliada de alguma forma por uma ferramenta
escrita em Perl. Em todos os sistemas operacionais unix-like existem scripts
Perl para as mais diversas tarefas dentro do sistema operacional.
Com as informações acima, não é difícil imaginar todas as grande corporações,
provedores, hostings, startups, que fazem uso do Perl.
Assim como Hassan Schroeder, o primeiro webmaster da Sun afirmou: "Perl is the
duct tape of the Internet.".
Para saber mais:
http://www.oreillynet.com/pub/a/oreilly/perl/news/importance_0498.html
4. A Cultura Perl
Neste capítulo gostaria de deixar o Sr. Larry Wall dar as suas próprias
opiniões a respeito:
|
| Seriously though, if there iss a germ of an important idea in Perl
| Culture, it's this: that too much control is just as deadly as too little
| control. We need control and we need chaos. We need order, and disorder.
| Simplicity, and complexity. Carefulness, and recklessness. Poise, and
| panic. Science, and art. ( Larry Wall )
|
|
| We like to see that "There's more than one way to do it," because it
| breaks us out of our cultural preconceptions. ( Larry Wall )
|
|
| But the right subset of Perl does survive. The dinosaurs will die off, and
| the monkeys will end up writing the poetry. Some of that poetry is even
| written in Perl, a language that can definitely be classified as
| "quirky". ( Larry Wall )
|
|
| We don't expect a native German speaker to use the same subset of English
| as a native Mandarin speaker. Similarly, we don't look down on people for
| using subsets of Perl. ( Larry Wall )
|
|
| There are certainly enough of them. You can write Perl programs that resemble
| sed, or awk, or C, or Lisp, or Python. This is Officially Okay in Perl
| culture. By way of contrast, try writing in the C subset of C++ and they'll
| make a laughingstock of you. ( Larry Wall )
|
|
| But seriously, many computer scientists have fallen into the trap of
| trying to define languages like George Orwell's Newspeak, in which it is
| impossible to think bad thoughts. What they end up doing is killing the
| creativity of programming. ( Larry Wall )
|
Além de mostrar as frases do célebre autor, quero ressaltar a importância da
cultura em si. O intuito é ajudar as pessoas a entenderem o motivo daquele
"pseudo-dogma" para que torne-se cultural, para que as pessoas realmente
acreditem nestas preposições, é uma forma muito mais elegante e eficiente de
influência um uso correto da linguagem, sem sacrificar a criatividade para
isso.
É essencial pensar nestas colocações antes de continuar.
Para saber mais:
http://www.wall.org/~larry/keynote/keynote.html
4.1 Comunidade e Encontros Sociais
Depois desta dose "cultural" é natural concluir que os programadores Perl
sejam unidos, afinal, eles dividem as mesmas crenças. Estes são os lugares:
4.1.1 Perl Mongers
O programador envolvido com a comunidade Perl e que acredita na cultura da
linguagem é normalmente chamado de "Perl Monger".
Em 1998 o primeiro grupo de programadores Perl foi criado por Brian D Foy [1]
em Nova York, durante a primeira O'Reilly Perl Conference. A primeira idéia
para o nome deste grupo era: /New York Perl M((o|u)ngers|aniacs)*/. Porem o
"Monger" acabou ficando mais popular.
Repare que a palavra "Monger" (ou Monge, em português) refere-se a fortes
crenças na cultura da linguagem.
[1] http://en.wikipedia.org/wiki/Brian_D_Foy
Para saber mais:
* http://en.wikipedia.org/wiki/Perl_Monger
4.1.2 Sites:
* http://perl.org
O principal endereço, com links para download da linguagem,
documentação, etc;
* http://www.perlmonks.com/
O principal forum da comunidade, onde você consegue encontrar ajuda para
qualquer problema relacionado a Perl. Tem um excelente histórico, poucas
perguntas ainda não foram respondidas. Também tem exemplos de código,
dicas de programação, perguntas e repostas, bibliotecas, entre outros;
* http://planet.perl.org/
http://ironman.enlightenedperl.org/
http://perlsphere.net/
Junção dos principais blogs sobre Perl;
* http://use.perl.org/
Novidades relativas a communidade, seu funcionamento é inspirado em uma
revista ou jornal;
4.1.3 Comunidades Locais:
Na cultura da linguagem também nasceu o costume de reuniões em grupos menores
e unidos pela localização geográfica. O registro dos grupos pode ser
encontrado no http://www.pm.org/.
O grupo responsável por este documento é o São Paulo Perl Mongers
(http://sao-paulo.pm.org/), formado em 2000.
4.1.4 Lista de discussão e IRCs
Outro costume da comunidade é manter-se em contato através de listas de
discussão [1] e também dos canais IRC [2]. Oferecendo oportunidades para os
participantes interagirem em problemas relacionados ao desenvolvimento Perl,
boas práticas e troca de experiências.
Aproveitamos este material para convidar a todos para participar de nossa
lista e canal IRC:
* http://mail.pm.org/mailman/listinfo/saopaulo-pm
* irc.perl.org, #sao-paulo.pm
[1] http://en.wikipedia.org/wiki/Electronic_mailing_list
[2] http://en.wikipedia.org/wiki/IRC
4.1.5 Encontros Sociais
Este é outro item da nossa cultura. Encontros periódicos, para um happy-hour
no qual o assunto principal é Perl, extremamente divertido e produtivo. Você
saberá quando acontecerá o próximo acompanhando a nossa lista de discussão
(São Paulo Perl Mongers).
5. Plataformas Suportadas
Agora que você já tem as bases sobre a cultura Perl e todo o embasamento
teórico necessário, vamos nos focar a utilização desta linguagem. O primeiro
passo é assegurar se a plataforma de sua preferência terá suporte.
* Unix-like: AIX, BSD/OS, Darwin, dgux, DYNIX/ptx, FreeBSD, Haiku, Linux
(ARM), Linux (i386), Linux (i586), Linux (PPC), HP-UX, IRIX, Mac OS X,
MachTen PPC, NeXT 3, NeXT 4, OpenBSD, OSF1, reliantunix-n, SCO_SV, SINIX-N,
sn4609, sn6521, sn9617, SunOS (sun4-solaris) , SunOS (i86pc-solaris) e
SunOS4;
* MSDOS-like: MS-DOS, PC-DOS, OS/2, Windows 3.1, Windows 95, Windows 98,
Windows ME, Windows NT (Alpha), Windows NT (PPC), Windows 2000, Windows XP,
Windows 2003, Windows CE, Windows Vista, Windows 7, Windows 2008 e Cygwin;
* Outras: Amiga DOS, BeOS e MPE/iX;
Lembrando que o código escrito em Perl é portável dentre as plataformas,
portando, com alguns cuidados é plenamente possível escrever códigos que
funcionam nas 45 plataformas citadas aqui.
É importante lembrar que a expansão do Perl em outras plataformas é
constante, então, a nossa lista só tende a crescer.
Para saber mais:
* http://perldoc.perl.org/perlport.html#PLATFORMS
6. Instalação do Perl
Para conitunar com este curso, nós agora devemo saber instalar o Perl. Aqui
cobriremos os sistemas operacionais mais comumente utilizado, tanto no meio
acadêmico quanto corporativo.
6.1 Unix-like
6.1.1 FreeBSD
Ao fazer isso no FreeBSD nós temos duas opções:
* Ports:
Cada port contêm todas as instruções necessárias para fazer os fontes
originais do projeto compilarem e serem executados no FreeBSD. Ao instalar
um "Port" o Makefile [1] busca automaticamente os fontes da aplicação
desejada, tanto em disco local quanto remoto (HTTP/FTP), em seguida, os
fontes são descompactados em um diretório. O próximo passo é aplicar os
patches necessários (a maioria deles visa compatibilidade com o FreeBSD),
após, os fontes já estão prontos para compilar.
A seguir, esta apostila vai demonstrar os poucos comandos necessários para
cumprir todos os procedimentos listados acima -- portanto, é presumido que
o leitor esteja com acesso ao terminal (local, virtual ou remoto). Segue:
|
| # uname -a
| FreeBSD bsd.domain.com.br 8.0-RELEASE-p2 FreeBSD 8.0-RELEASE-p2 #0:
| Tue Jan 5 21:11:58 UTC 2010
| root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64
|
| # cd /usr/ports/lang/perl5.10 && make install clean
|
Nota: o primeiro comando é apenas uma demonstração de qual a versão
empregada do sistema; o segundo, é praticamente todo o trabalho necessário,
com exceção de responder algumas simples perguntas durante o processo.
Para saber mais:
http://www.freebsd.org/doc/en/books/developers-handbook/tools-make.html
* Packages:
Os packages consistem em instalar um pacote préviamente
compilados. Alguns cluster são empregados pelo time de desenvolvimento do
FreeBSD para compilar o máximo de pacotes possíveis estas plataformas:
alpha, amd64, ARM, i386, ia64, MIPS, PC98, PPC, Sparc64, Sun4v e Xbox.
Para isso, basta:
|
| # pkg_add -rv perl5.10
|
Reparece que isso consiste apenas em dois comandos, sendo um deles o nome
do pacote que nós desejamos. Esta forma de instalação cobre também todas as
dependências necessárias, ou seja, para instalar o Perl você vai precisar
instalar suas dependências, e o FreeBSD Package System fará isso por
você.
6.1.2 GNU/Linux
O projeto Linux está disposto de forma diferente, se compararmo-os ao FreeBSD.
Pois o Linux é representado enquanto sistema operacional porque grupos de
usuários fazem versões customizadas e mais completas, estas são chamadas
distribuições. Abaixo, mostraremos exemplos nos dois principais tipos de
distribuições atualmente.
Para Linux, não será demostrado uma forma de compilar os fontes, vamos nos
focar em usar os mecanismos da forma como a distribuição recomenda.
6.1.2.1 Debian's Like
É o padrão da distribuição ter o interpretador Perl instalado, sendo que
inúmeros de seus scripts básicos são feitos nesta linguagem.
A forma como o Debian mantêm os seus pacotes é de forma binária, a exemplo da
maioria das outras distribuições Linux. Isso denota o fato de nós instalarmos
arquivos pré-compilados no seu SO. Estes são feitos com auxílio de inúmeros
colaboradores do projeto, um trabalho meticuloso para deixar muitos softwares
a disposição de seus usuários.
Se houver alguma customização do SO, ou qualquer outra situação em que o Perl
não esteja instalado, poremos seguir os procedimentos para reverter esta
situação:
|
| # apt-get update && apt-get install perl
|
Novamente, o exemplo de instalação assume que você está com a sua base de
pacotes atualizada, vide o primeiro comando. O segundo toma conta de tudo mais
o que é necessário, download, desempacotar, instalar e registrar perante a
base do SO.
Em um futuro próximo o projeto Debian vai usar mais Perl. O substituto do APT
é o projeto denominado Cupt [1], o qual é escrito em Perl.
[1] http://wiki.debian.org/Cupt
6.1.2.2 Red Hat's Like
O projeto Red Hat é a distribuição mais antiga de Linux, nela o recomendado é
fazer uso da ferramenta RPM (Red Hat Package Manager) [1]. Da mesma forma como
no Debian, nós vamos fazer uso de uma versão préfiamente customizada (em
alguns casos), compilada e empacotada pelo time de desenvolvimento da Red Hat,
com auxílio de inúmeros colaboradores do projeto.
Nesta tipo de distribuição o normal é que o interpretador Perl venha instalado
por padrão, já que esta faz parte da sua construção. Se em casos específicos o
interpretador Perl não esteja presente, execute os comandos abaixo:
|
| # yum update && yum install perl
|
O primeiro comando é apenas um gancho para recomendar que a base de pacotes
esteja sempre atualizada. O segundo dá inicio a cadeia de ações necessárias
para baixar, interpretar e fazer a instalação dos componentes, bem como suas
dependências, na instalação local.
[1] http://en.wikipedia.org/wiki/RPM_Package_Manager
6.2 Windows
Este curso está focado em ambientes unix-like, acima foi demostrando a
instalação da linguagem nos seus "sabores" mais comuns. Porem, não vamos
deixar o leitor e usuário dos ambientes baseados em Microsoft Windows
desamparados, seguem as referências técnicas para o orientar:
http://win32.perl.org/wiki/index.php?title=Main_Page
http://www.activestate.com/activeperl/
http://www.perl.com/download.csp#win32
7. Documentação do Perl
O projeto em torno da linguagem Perl nunca esqueceu de manter e aumentar a sua
documentação. Hoje, podemos afimar que a documentação do Perl em si, e seus
módulos são extremamente completos, uma base sólida para o estudente, usuário
da linguagem. Para uma linguagem ser produtiva, o acesso a documentação deve
ser rápido e eficiente, afinal, nós programadores precisamos consultar
constantemente as propriedades de um módulo, exemplos de utilização, entre
outros.
Enquanto falamos de Perl, o projeto que cuida da sua documentação é o Perldoc,
este não passa de uma ferramenta para procurar e interpretar os arquivos tipo
"pod".
* Pod ("Plain Old Documentation") [1]: É uma linguagem de marcação ("Markup
Language" [2]) simples e fácil de usar, com o propósito de documentar
softwares escritos em Perl e seus módulos;
Esta é a forma para ler e buscar informações na documentação, para isso
existem duas formas principais, explicadas a seguir.
[1] http://perldoc.perl.org/perlpod.html
[2] http://en.wikipedia.org/wiki/Markup_language
7.1 Perldoc no Site
O site do Perldoc (http://perldoc.perl.org/) é relativamente novo, com grandes
melhorias na navegação, busca, indexes, sintaxe, entre outros. No site você
também consegue fazer download das páginas em PDF ou HTML. Para o aluno,
iniciante, o mais indicado é começar a fazer a leitura da documentação através
do site, visto que este é uma interface mais intuitiva e amigável.
7.2 Perldoc no Terminal
Outra forma de acessar o conteúdo do Perldoc é através da linha de comando.
Exemplo:
|
| $ perldoc perldoc
|
Observe, nós estamos passando um argumento para o comando, este indica qual
documentação nós queremos ler. Normalmente, o Perldoc organiza a documentação
que faz parte do "core" da linguagem com o sufixo "perl".
Exemplos:
perl, perl5004delta, perl5005delta, perl561delta, perl56delta,
perl570delta, perl571delta, perl572delta, perl573delta, perl581delta,
perl582delta, perl583delta, perl584delta, perl585delta, perl586delta,
perl587delta, perl588delta, perl589delta, perl58delta, perlaix, perlamiga,
perlapi, perlapio, perlapollo, perlartistic, perlbeos, perlbook, perlboot,
perlbot, perlbs2000, perlcall, perlce, perlcheat, perlclib, perlcn,
perlcommunity, perlcompile, perlcygwin, perldata, perldbmfilter,
perldebguts, perldebtut, perldebug, perldelta, perldgux, perldiag,
perldoc, perldos, perldsc, perlebcdic, perlembed, perlepoc, perlfaq,
perlfaq1, perlfaq2, perlfaq3, perlfaq4, perlfaq5, perlfaq6, perlfaq7,
perlfaq8, perlfaq9, perlfilter, perlfork, perlform, perlfreebsd, perlfunc,
perlglossary, perlgpl, perlguts, perlhack, perlhist, perlhpux, perlhurd,
perlintern, perlintro, perliol, perlipc, perlirix, perljp, perlko,
perllexwarn, perllinux, perllocale, perllol, perlmachten, perlmacos,
perlmacosx, perlmint, perlmod, perlmodinstall, perlmodlib, perlmodstyle,
perlmpeix, perlnetware, perlnewmod, perlnumber, perlobj, perlop,
perlopenbsd, perlopentut, perlos2, perlos390, perlos400, perlothrtut,
perlpacktut, perlplan9, perlpod, perlpodspec, perlport, perlqnx, perlre,
perlrebackslash, perlrecharclass, perlref, perlreftut, perlreguts,
perlrequick, perlreref, perlretut, perlriscos, perlrun, perlsec,
perlsolaris, perlstyle, perlsub, perlsyn, perlthrtut, perltie, perltoc,
perltodo, perltooc, perltoot, perltrap, perltru64, perltw, perlunicode,
perlunifaq, perluniintro, perlunitut, perlutil, perluts, perlvar,
perlvmesa, perlvms, perlvos, perlwin32, perlxs e perlxstut;
A quantidade de exemplos não tem o intuito de deixar o leitor iniciante
confuso, apenas de mostrar a enorme quantidade de documentação que a linguagem
tem. Este é um pequeno exemplo, a saber.
7.3 Livros
A quantidade de livros sobre a linguagem é quase tão grande quanto o Perldoc.
Para o leitor que prefere uma interação com um livro tradicional, não vão
faltar opções: http://books.perl.org/books, somente nesta página são 266
livros. Para o iniciante, seguem os títulos mais recomendados:
* Beginning Perl Web Development: From Novice to Professional (Suehring);
* Beginning Perl, Second Edition (James Lee);
* Higher-Order Perl (Dominus);
* Learning Perl Objects, References & Modules (Schwartz, Phoenix);
* Learning Perl on Win32 Systems (Olsen, Schwartz, Christiansen);
* Learning Perl, 4th ed. (Schwartz, Phoenix, Brian d Foy);
* Mastering Perl (Brian d Foy);
* Mastering Regular Expressions, Second Edition (Friedl);
* Modern Perl Programming;
* Network Programming with Perl (Stein);
* Object Oriented Perl (Conway);
* Perl Best Practices (Conway);
* Perl Cookbook, 2nd ed. (Torkington, Christiansen);
* Writing Perl Modules for CPAN (Tregar);
8. Executando os Programas em Perl
Agora nós estamos partindo para a parte mais voltada a prática, deste
material. O primeiro passo é saber como os programas em Perl serão
executados. Basicamente, existem duas formas para isso:
8.1 Interpretador
A forma mais simples, é chamar o interpretador diretamente via linha de
comando:
|
| $ perl hello_world.pl
|
Veja que o parâmetro para o interpretador é o caminho de um arquivo contendo
código válido Perl, neste caso acima, o arquivo está no mesmo diretório.
Outra forma de usar o interpretador diretamente, é:
|
| $ perl -e 'print "Hello Perl World!";'
|
Esta segunda forma nos dá muita praticidade para o dia-a-dia, pois pode
funcionar como ferramenta para linha de comando, com todo o poder de Perl,
exemplo:
|
| $ cat /etc/passwd \
| | perl -ne 'print $1, "\n" if ( /^(\w+):.*?$/ );' \
| | head
| root
| toor
| daemon
| operator
| bin
| tty
| kmem
| games
| news
| man
|
8.2 Script Executável
O outro jeito de executar um software escrito em Perl é, gravar todo ele em um
arquivo e o transformar em um executável. Veja os exemplos:
|
| $ echo '#!/usr/bin/env perl' > /var/tmp/test.pl
| $ echo 'print "Hello, Perl World!";' >> /var/tmp/test.pl
|
Repare que na primeira linha do script é uma indicação de quem vai interpretar
os dados que estão nas linhas seguintes, o nome desta entrada é Shebang [1].
Nós poderíamos informar o binário do Perl diretamente, por exemplo:
"/usr/bin/perl" ou "/usr/local/bin/perl" (dependendo de onde ele foi
instalado), no entanto, com o auxílio do "env" (/usr/bin) [2] nós podemos
simplificar.
Agora que nós já vemos um script válido, vamos dar permissão de execução:
|
| $ chmod +x /var/tmp/test.pl
|
E testar:
|
| $ /var/tmp/test.pl
| Hello, Perl World!
|
[1] http://en.wikipedia.org/wiki/Shebang_%28Unix%29
[2] http://linux.die.net/man/1/env
9. Sintaxe
####### RASCUNHO #######
* Todos os statements são terminados por ";";
* Variáveis são indicadas por caracteres especiais "$", "%", "@";
* Funções são chamadas por seu nome seguido de "()" ou "&";
* Referências são feitas com "\" seguindo do nome do método ou variável;
* Blocos especiais __DATA__ (verificar outros);
* Variáveis pré existentes ($ perldoc perlvar);
* Operadores numéricos:
* Comparação de números;
* Comparação de Texto;
* Operadores Lógicos;
* Condições;
* Estrutura de repetição;
* Concatenar texto;
10. Estrutura da Linguagens
Após fazer toda a apresentação sobre o que envolve a linguagem, incluindo sua
história, documentação e conceitos básicos de programação, chegou a hora de
colocarmos os nossos conhecimentos em prática com Perl.
Este capítulo é dedicado a apresentar as estruturas da linguagem, e dar
exemplos para o seu uso no dia-a-dia.
10.1 Scalar
Um scalar é o dado mais simples que o Perl manipula. Podendo ser tanto um
número como uma string de caracteres. No entanto, você pode imaginar um número
e uma string como estruturas muito diferentes, porem, o Perl as usa de forma
muito parecida, portanto são descritas juntas.
Exemplos:
|
| my $test = q{Hello, Perl World!}; # Hello, Perl World!
| my $test = "I'm a String!"; # I'm a String!
| my $test = 123456; # 123456
| my $test = "123456"; # 123456
| my $test = "123" . "456"; # 123456
| my $test = 123 + 456; # 579
|
Um valor scalar também pode atuar sobre operadores, como mostrado nos exemplos
acima, repare que ao final existe um comentário com o valor esperado na
variável "$test". Também, um scalar pode ser guardado dentro do outro, e podem
ser guardados dentro de devices [1] ou arquivos texto.
Saiba mais:
http://perldoc.perl.org/functions/scalar.html
[1] http://en.wikipedia.org/wiki/Device_file
10.1.1 Referências
Ao mesmo temo que o scalar é o tipo mais simples, ele pode guardar referências
para estruturas mais complexas, no Perl nós chamamos isso de referência.
Exemplos:
|
| my $reference = \%complex_hash; # HASH(0x600e78)
| my $reference = \@complex_array; # ARRAY(0x600f58)
|
Agora um exemplo um pouco mais avançado, mostrando que até métodos podem ser
passados como referencia:
|
| #!/usr/bin/env perl
|
| use strict;
| use warnings;
|
| sub method { print @_, "\n"; }
|
| my $reference = \&method;
|
| &{$reference}("string");
|
| __END__
|
O exemplo acima também mostra como Perl é uma linguagem dinâmica no seu
interior, e demostra também a forma como o interpretador usa para chamar
determinadas rotinas.
10.2 Arrays
Array é simplesmente uma lista ordenada de dados, ou seja, um tipo espacial de
variável que suporta uma lista no Perl. Cada elemento do array é um scalar em
separado, com um valor scalar.
Arrays em Perl podem ter qualquer número de elementos. O menor array é o que
tem zero elementos, enquanto o maior, pode preencher toda a memória
disponível. Mantendo uma filosofia do Perl de não manter limites
desnecessários.
Exemplos:
|
| my @week = ( "Mon", "Tue", "Web", "Thu", "Fry" );
| my @week = ( 1, 2, 3, 4, 5 );
| my @week = ( [ 1, 2, 3 ], [ 4, 5, 6 ] );
|
10.2.1 Indexes nos Arrays
Cada elemento em um array Perl tem uma posição, no qual, a primeira é sempre
zero. Também possuem tamanho dinâmico, sendo possível incluir um elemento ao
final, a qualquer momento.
Para saber o tamanho de um array, basta incluir um "#" logo após a
representação scalar de um array:
|
| my @week = ( "Mon", "Tue", "Web", "Thu", "Fry" );
| print $#week; # 4
|
O aluno, neste momento pode estar um pouco confuso a respeito da representação
scalar de um array. Esta funciona como uma referência, explicada há poucos
capítulos atrás, para o array.
Uma outra forma de receber a representação scalar, é incluir o método scalar
[1]:
|
| my @week = ( "Mon", "Tue", "Web", "Thu", "Fry" );
| print scalar @week; # 5
|
Porem, neste segundo exemplo existe uma diferença entre os resultados. O
causador desta discrepância é que neste último, nós estamos trazendo o array
para um contexto scalar e diferentemente do anterior, nós não estamos pedindo
o número de elementos de uma lista. No contexto scalar, elementos não tem
indexes zero.
Agora que citamos a palavra "index" é necessário explicar como eles funcionam
em um array, ou seja, todo elemento tem um número correspondente. Podemos
demonstrar isso com mais um exemplo:
|
| my @week = ( "Mon", "Tue", "Web", "Thu", "Fry" );
| print $week[4]; # Fry
|
[1] http://perldoc.perl.org/functions/scalar.html
10.2.2 Funções para Manipular Listas/Arrays
Por padrão o Perl já nos deixa métodos para manipular as listas, neste
capítulo vamos citar os mais importantes e comuns:
* push [1]: Este método serve para incluir um elemento em um array, porem,
sempre ao final dele, por este motivo, o "push" sempre requer um ou mais
argumentos. Exemplo:
|
| my @week = ( "Mon", "Tue", "Web", "Thu", "Fry" );
| push @week, "Sat"; # Mon, Tue, Web, Thu, Fry, Sat
|
* pop [2]: Este método faz exatamente ao inverso do "push", ele retira um
elemento do final de um array. Exemplo:
|
| my @week = ( "Mon", "Tue", "Web", "Thu", "Fry" );
| pop @week; # Mon, Tue, Web, Thu
|
* shift [3]: Basicamente, este método faz o mesmo que o "pop", porem, ele não
age ao final do array, e sim no seu início. Exemplo:
|
| my @week = ( "Mon", "Tue", "Web", "Thu", "Fry" );
| shift @week; # Tue, Web, Thu, Fry
|
Os métodos apresentados aqui são para funções básicas, no entanto, tenha a
certeza de que o leitor irá encontrar muitos módulos para as mais diversas
funções com arrays dentro da CPAN.
[1] http://perldoc.perl.org/functions/push.html
[2] http://perldoc.perl.org/functions/pop.html
[3] http://perldoc.perl.org/functions/shift.html
10.3 Hashes
Um Hash [](também conhecido como Array Associativo [1]) é uma estrutura parecida
com um Array, o qual foi apresentado a pouco, uma coleção de variáveis tipo
Scalar, com elementos individuais servindo como índice para esta estrutura. Ao
contrário de um Array, os índices não são elementos pequenos, com valores
inteiros não-negativos, são valores tipo scalar arbitrariamente escolhidos,
estes são chamados de "keys" (ou chaves, em português), e são utilizados para
obter o dado de uma determinada parte do Hash.
A forma mais fácil de entender um Hash, é olhar para os exemplos:
|
| my %hash = {
| chave => "valor",
| numero => 1,
| objeto => \$referencia,
| };
|
Agora, a forma de obter os dados desta estrutura será assim:
|
| $hash{chave} == "valor";
|
O método mais utilizado, é o "keys" [2]. Veja um exemplo:
|
| foreach my $k ( keys %hash ) {
| print "chave: $k -> valor: $hash{$k}\n";
| }
|
O método "keys" é utilizado para obter somente as chaves de um Hash, fazendo
seu retorno em forma de um array.
Porem, existem outros métodos:
* each [3]: Quando invocado em um contexto de lsita, ele retorna dois
elementos consecutivos, no qual o primeiro é a chave e o segundo é o valor,
e assim sucessivamente para o Hash. Portanto você pode iterar [7] sobre a
estrutura, veja:
|
| while ( my ( $key, $value ) = each %hash ) {
| print "chave: $key -> valor: $value\n";
| }
|
* delete [4]: Se você informar como parâmetro um elemento de um Hash, ou
Array, ele vai deletar o elemento especificado, e, como retorno deste
método é utilizado o valor antigo da parte que está sendo removida, veja o
exemplo:
|
| my $scalar = delete $hash{numero}; # 1
|
* exists [5]: Informando como parâmetro um elemento de um Hash ou Array, este
método nos retornará "true" [8] (verdadeiro). Veja:
|
| print "Existe\n" if exists $hash{chave};
|
* values [6]: Retorna uma lista somente com os valores que um Hash contêm,
este método faz o inverso do "keys":
|
| foreach my $value ( values %hash ) {
| print "value: $value\n";
| }
|
Observe atentamente o funcionamento do Hash em Perl, porque ele é largamente
utilizado para os elementos estruturais da linguagem, por ser extremamente
flexível. Outro fator de atenção é que estruturas no padrão Hash são, também,
muito utilizadas em outros sistemas computacionais, como caches, bancos de
dados não-relacionais, etc.
Para saber mais:
http://www.cs.mcgill.ca/~abatko/computers/programming/perl/howto/hash/
http://www.perl.com/pub/a/2006/11/02/all-about-hashes.html
[1] http://en.wikipedia.org/wiki/Associative_array
[2] http://perldoc.perl.org/functions/keys.html
[3] http://perldoc.perl.org/functions/each.html
[4] http://perldoc.perl.org/functions/delete.html
[5] http://perldoc.perl.org/functions/exists.html
[6] http://perldoc.perl.org/functions/values.html
[7] http://en.wikipedia.org/wiki/Iteration#Computing
[8] http://en.wikipedia.org/wiki/Boolean_algebra_%28logic%29
10.4 Estruturas Complexas
Neste ponto, nós já sabemos quais os principais tipos de dados no Perl, como
eles são utilizados e até presenciamos alguns exemplos introdutórios. Porem, o
leitor que já tem mais experiência em desenvolvimento de softwares nos
pergunta se é possível misturar os vários tipos de estrutura, e a reposta é
Sim. Sim, é possível fazer uso de todos os tipos de estruturas nativas do perl
de forma misturada, assim como mostramos no exemplo a seguir:
|
| my $mix = [
| { a_hash => "yes",
| another_value => 1,
| },
| [ 1, 2, 3, 4, 5 ],
| ];
|
Na estrutura acima temos um scalar recebendo uma referência de um array, e
dentro deste um hash e outro array.
Com estas opções Perl é o suficiente para lidar com qualquer tipo de dado ou
estrutura que um software pode necessitar.
Para saber mais:
http://perldoc.perl.org/perldsc.html
http://docstore.mik.ua/orelly/perl/prog3/ch09_03.htm
http://www.cbs.dtu.dk/courses/27619/advanced1.html