# Perl

Perl é uma família de duas linguagens de programação multiplataforma, Perl 5 e Perl 6.
Originalmente, Perl foi desenvolvida por Larry Wall em 1987; desde então, a linguagem passou por muitas atualizações e revisões até chegar à versão Perl 5 em 1994. Perl 6, desenvolvido a partir do Perl 5 em 2000, eventualmente evoluiu para uma linguagem distinta. Ambas as linguagens continuam a ser desenvolvidas independentemente por equipes diferentes.
Perl é usada em aplicações de CGI para a web, para administração de sistemas linux e por várias aplicações que necessitam de facilidade de manipulação de strings. Permite a criação de programas em ambientes UNIX, MSDOS, Windows, Macintosh, OS/2 e outros sistemas operacionais. Além de ser muito utilizada para programação de formulários www e em tarefas administrativas de sistemas UNIX - onde a linguagem nasceu e se desenvolveu -, possui funções muito eficientes para manipulação de textos. Seu slogan "There's more than one way to do it" (Existe mais de uma maneira de fazer isso) demonstra exatamente o propósito da linguagem: sua flexibilidade e capacidade de fazer códigos funcionais.

## Origem

A linguagem Perl foi desenvolvida por Larry Wall. Inicialmente, o nome seria "PEARL", porém já existia uma linguagem com esse nome, então Wall alterou para "Perl". Seu lançamento deu-se em 1987 (4 anos antes do Linux) quando Larry postou o Perl no grupo de notícias da Usenet "comp.sources". Antes disso, praticamente todo processamento de texto em sistemas baseados em Unix era feito com uma porção de ferramentas, tais como o AWK, 'sed', C e diversas linguagens shell script. A ideia de Wall foi juntar as principais vantagens de todas essas linguagens: expressões regulares do 'sed'; a identificação de padrões de AWK; a profundidade de C; além da sintaxe baseada tanto em C quanto em Shell Script.
Pouco tempo depois de sua primeira versão, Perl se popularizou. Originalmente, a única documentação existente era uma única página de manual, até que, em 1991, foi publicada a referência definitiva da linguagem, Programming Perl, que ficou conhecida pelos programadores como o "livro do camelo”, por conta da imagem em sua capa. Em 1992, Perl já estava na versão 4 e tornou-se uma linguagem padrão para Unix. Porém, foi também nessa época que a linguagem de Larry começou a mostrar suas limitações. Apesar de ser excelente para administradores de sistemas escreverem pequenos e poderosos códigos, era inviável desenvolver programas maiores com o Perl. Foi quando a equipe, ainda liderada por Larry Wall, começou a desenvolver a versão 5, lançada em 1994. A partir de então, a linguagem subiu de patamar; tornou-se, como muitos acreditam, uma linguagem completa, e não apenas auxiliar.

## Histórico de versões (Perl 1.0 a 5.28)

Histórico :
| Versão | Ano de lançamento |
| 1.0 | 1987 |
| 2.0 | 1988 |
| 3.0 | 1989 |
| 4.0 | 1993 |
| 5.0 | 1994 |
| 5.005 | 1998 |
| 5.6 | 2000 |
| 5.8 | 2000 |
| 5.10 | 2008 |
| 5.11 | 2009 |
| 5.12 | 2010 |
| 5.14 | 2011 |
| 5.16 | 2012 |
| 5.18 | 2013 |
| 5.20 | 2014 |
| 5.22 | 2015 |
| 5.24 | 2016 |
| 5.26 | 2017 |
| 5.28 | 2018 |

## Características da linguagem

No geral, a sintaxe de um programa em Perl se parece muito com a de um programa em C: existem variáveis, expressões, atribuições, blocos de código delimitados, estruturas de controle e sub-rotinas.
Além disso, Perl foi bastante influenciado pelas linguagens de shell script: todas as variáveis escalares são precedidas por um cifrão ($). Essa marcação permite identificar perfeitamente as variáveis num programa, onde quer que elas estejam. Um dos melhores exemplos da utilidade desse recurso é a interpolação de variáveis diretamente no conteúdo de strings. Perl também possui muitas funções integradas para tarefas comuns como ordenação e acesso de arquivos em disco.
Perl pega emprestado as listas de Lisp, as arrays associativas (tabelas hash) de awk e as expressões regulares de sed. Isso tudo simplifica e facilita qualquer forma de interpretação e tratamentos de textos e dados em geral.
A linguagem suporta estruturas de dados arbitrariamente complexas. Ela também possui recursos vindos da programação funcional (as funções são vistas como um outro valor qualquer para uma sub-rotina, por exemplo) e um modelo de programação orientada a objetos. Perl também possui variáveis com escopo léxico, que tornam mais fácil a escrita de código mais robusto e modularizado.
Todas as versões de Perl possuem gerenciamento de memória automático e tipagem dinâmica. Os tipos e necessidades de cada objeto de dados no programa são determinados automaticamente; memória é alocada ou liberada de acordo com o necessário. A conversão entre tipos de variáveis é feita automaticamente em tempo de execução e conversões ilegais são erros fatais.

### Pontos Fortes

* Perl é muito portátil (multiplataforma);
* Perl é excelente para manipulação de textos e arquivos;
* Perl é uma Linguagem de programação de alto nível, tirando do programador muitas preocupações referentes a aspectos mais baixos;
* A linguagem Perl foi criada e desenvolvida com o ideal de Software livre. Esse aspecto tornou-se uma característica intrínseca e os programadores contam com uma ampla comunidade, que ajuda no desenvolvimento e manutenção da linguagem e dos códigos. Exemplo disso é a CPAN, Comprehensive Perl Archive Network (rede de repositórios de Perl). Este repositório possui mais de 100 mil módulos para Perl, bem como suas documentações.

### Pontos Fracos

* Scripts escritos em Perl são bem mais lentos que os de outras linguagens compiladas, isto é devido a existência do interpretador;
* Um pequeno código PERL é capaz de realizar muitas ações. Em termos de linguagem de programação, isso geralmente significa que o código será difícil de ler e penoso de escrever;
* Scripts escritos em Perl permitem a visualização do código fonte, impedindo os programadores de esconder o código.
* Perl não possibilita o acesso a funções de baixo nível, reduzindo a liberdade do programador nestes tipos de caso.

### Resumo

* Sua interface de integração com banco de dados (DBI e DBIx::Class) suporta muitos bancos de dados, incluindo Oracle, Sybase, PostgreSQL, MySQL e outros
* Perl tem módulos para trabalhar com HTML, XML, e outras linguagens de markup
* Perl suporta Unicode
* Perl permite programação procedural e orientada a objetos
* Perl pode acessar bibliotecas externas em C/C++ através de XS ou SWIG
* Perl é extensível. Existem milhares de módulos disponíveis no Comprehensive Perl Archive Network (CPAN)
* O interpretador Perl pode ser embutido em outros sistemas

### Perl e a World Wide Web

* Perl é conhecida como o "Canivete Suíço da Internet";
* O módulo Perl CGI.pm, que faz parte da distribuição padrão, serve como script do lado do servidor
* Perl pode manipular dados criptografados, incluindo transações de comércio eletrônico;
* mod perl permite que o servidor web Apache possa interpretar códigos Perl diretamente;
* O pacote DBI do Perl faz com que a integração com banco de dados seja muito simples. E com pacote DBIx::Class, utiliza-se orientação a objetos para trabalhar diretamente com bancos de dados;
* Existe um Web Framework (servidores web) chamado Catalyst que é feito em Perl, bastante utilizado;

### Portabilidade

* Perl é uma linguagem que já foi portada para diversos sistemas operacionais;

## Tipos de dados

O Perl tem uma série de tipos de dados fundamentais, porém é considerada uma linguagem não tipada, ou seja, as variáveis não são restringidas a usar um único tipo. Os mais utilizados são: escalar, vetor (array), hash (vetor associativo), handle de um arquivo e sub-rotinas.
* Escalar: é um valor único, que pode ser um número, uma string ou uma referência. É declarada com um '$', como:
* Array: é um conjunto sequencial ordenado de escalares. O índice inicial de uma variável array é zero (0). É declarada com um '@', como:
* Hash: Um hash, ou array associativo, é um mapeamento (ou seja, chaves de referências) de strings para escalares. Representa uma coleção de pares de chave/valor. São declarados com um '%', como:
* Handle: é um mapeamento para um arquivo, dispositivo ou pipe, que é aberto para leitura, escrita, ou ambos
* Sub-rotina: é um trecho de código que pode ser executado, para o qual podem ser passados argumentos, e do qual podem ser recebidos resultados

## Exemplos de código

A primeira linha de um código em Perl deve sempre começar com o shebang:
Esta linha informa onde está localizado o compilador do Perl e pode variar de sistema para sistema.

### Comentário

Note o ponto e vírgula no final de cada expressão. Assim como em C e C++, Perl exige que o usemos para indicar o final de uma expressão. A última linha é a que apaga o arquivo. unlink equivale a 'rm' e $0 é uma referência simples ao arquivo que está sendo executado.

### Expressão regular - Filtro

Um dos pontos fortes de Perl é o eficiente uso de expressões regulares no tratamento de textos e arquivos. Identificamos essas expressões pelos delimitadores "/.../", ou seja, tudo o que estiver entre essas barras será tratado como um pattern (padrão) para ser encontrado em determinado texto. O programa a seguir lê um texto e busca exatamente a expressão "foo":
Assim como as expressões regulares de Linguagens Regulares, Perl admite alguns símbolos especiais que facilitam a descrição de um padrão. São eles:
* "[" e "]"
* "(" e ")"
* "{" e "}"
Se quisermos utilizar o real significado de um desses símbolos, basta colocarmos uma barra invertida exatamente antes do mesmo.
O código abaixo busca o padrão assim descrito: nenhum ou muitos '+' seguido de um ou nenhum 'b'
É possível obter o mesmo resultado com uma única linha (um "one-liner"):
De fato, é comum a ocorrência de problemas que exigem dezenas de linhas em outras linguagens de programação mas que podem ser resolvidos com uma única linha de código em Perl, especialmente na área de ETL.

### Strings

Em Perl, strings podem ser descritas com aspas duplas ou simples, porém estas descrevem a string literalmente, enquanto aquelas interpretam símbolos de código. Exemplificando, as duas linhas de código a seguir resultam em saídas diferentes:
Saída:
Hello World!
Hello World!\n
Na primeira linha, com aspas duplas, o símbolo \n é interpretado como uma quebra de linha, enquanto, na segunda linha, o símbolo é impresso literalmente.

## Estruturas de controle

Perl tem as estruturas básicas esperadas em qualquer linguagem de programação:
* if
* while
* for
* until
Perl tira boas ideias de linguagens naturais, como a possibilidade de inverter a ordem dos elementos em uma frase. Por exemplo:
Pode ser reescrita como:

### Laço For

O laço for em Perl segue o mesmo estilo da linguagem C, inicializando uma variável, determinando seu limite e o passo do incremento. O código abaixo é um exemplo de for em Perl, imprimindo, a cada iteração, o valor da variável i, indo de 0 a 5.

## Módulos e frameworks

Perl conseguiu reunir módulos, classes, scripts e frameworks desenvolvidos pela comunidade em um só lugar, este lugar chama-se CPAN, repositório onde encontra-se quase tudo já desenvolvido para a linguagem:
* Catalyst (software) - Framework MVC para aplicações Web
* DBIx::Class - Modelo de mapeamento Objeto Relacional
* Template Toolkit - Sistema de processamento de templates
* WWW::Mechanize - Simula um navegador Web em um objeto Perl
* POE - Framework para aplicações multitarefa e em rede portáveis

## Interpretador Perl

Se você está num sistema Linux (ou a maioria dos sistemas UNIX, incluindo Mac Os X), provavelmente já há uma instalação do compilador Perl incluída no seu sistema. Digite o seguinte comando no terminal para descobrir qual versão você tem instalada:

## Aplicações

* TWiki - Sistema Wiki de escrita de conteúdo colaborativo
* RT - Sistema de processamento de Tickets
* Apache Spam Assassin - Sistema extensível de filtro de Spam em email
* dvd::rip - Programa para cópias de DVD
* AWStats - "Advanced Web Statistics" (AWStats) é um sistema de análise de logs de servidores Web e de geração de estatísticas
* DuckDuckGo - Motor de busca com a filosofia de não registrar as informações do usuário.

## Comunidade

Um dos pontos mais fortes da linguagem Perl é a comunidade de usuários em todo o mundo. Segundo a tradição internacional, esses grupos são denominados Perl Mongers.
Um grande ponto de encontro da comunidade é o YAPC. YAPCs são encontros promovidos pela comunidade para discutir coisas sobre Perl, os encontros podem ter caráter regional ou nacional. No Brasil ocorre uma vez por ano o YAPC::Brasil "Encontro Brasileiro de Programadores Perl".
Em 2009 o YAPC::Brasil aconteceu de 29 de outubro a 1 de novembro em Niterói, Rio de Janeiro. Em 2010 o evento ocorreu de 25 a 31 de outubro em Fortaleza, Ceará. Em 2013, o evento ocorreu nos dias 15 e 16 de Novembro, em Curitiba, Paraná. Em 2014, o evento foi realizado em Itapema, Santa Catarina, nos dias 19 e 20 de Setembro.