Um pouco de PERL

Neste artigo tento compartilhar com vocês um pouco do que aprendi da linguagem PERL (Practical Extraction and Report Language). A Perl é uma linguagem sem burocracia, para todos os gostos. Tem uma enorme flexibilidade e poder de operação. Espero que o material possa contribuir com o enriquecimento da comunidade. Para aqueles que ainda não conhecem essa linguagem, fica o convite para a leitura...

[ Hits: 37.902 ]

Por: Rafael Lebrão Martins em 25/09/2007


Arrays e algumas funções



Trabalhando com arrays (listas)

Uma array é um conjunto de dados, mantém diversos valores unidos de forma lógica. Além dos arrays, Perl possui um outro tipo de variável com múltiplos valores, os hashes.

Definição de arrays: uma lista de valores escalares ordenados. Assim como as escalares, os arrays também podem conter números, strings, ou ambos, além de também poder fazer referência a subarrays e subhashes.

Os valores de um array são agrupados entre parênteses como abaixo:

@dists = ("Slackware", "Debian", "Red Hat");

Podemos usar o "qw" para não ter que colocar todos os valores separados por "," deixando que ele faça isso por nós.

Ex:

@dists = qw("Slackware" "Debian" "Red Hat");

Para fazer referência a algum elemento de um array usamos os subscritos. Os subscritos de array são delimitados por colchetes [subscrito] (sempre iniciado pelo valor "0" e um a menos que a posição do elemento dentro da lista).

Ex:

$dists[0] = "Slackware"; # Posição no array = 1
$dists[1] = "Debian"; # Posição no array = 2
$dists[2] = "Red Hat"; # Posição no array = 3

OBS: Cada elemento de uma lista é um ESCALAR, por isso, ao fazer referência a algum deles, usamos o símbolo "$" e não "@".

Funções para listas

As funções são operadores que podem ser utilizadas para realizar tarefas variadas numa lista. Algumas delas são encontradas nos módulos do Perl. Vou falar um pouco sobre algumas funções que considero importantes para modificar listas.

chomp

Remove o caractere de nova linha final.

Ex:

1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 my $passwd = "/etc/passwd";
5 open (PASSWD, $passwd);
6 my @users = <PASSWD>;
7 close (PASSWD);
8 foreach (@users) {
9 chomp;
10 print $_;
11 }

Remove todo caractere "\n" (nova linha) no final de cada linha do arquivo "passwd" e imprime o arquivo sem o "\n". Como abaixo:

$ perl chomp.pl
root:x:0:0:,,,: /root: /bin/bashbin:x:1:1:bin: /bin:daemon:x:2:2:daemon: /sbin:adm:x:3:4:adm: /var/log:lp:x:4:7:lp: /var/spool/lpd:sync:x:5:0:sync: /sbin: /bin/syncshutdown:x:6:0:shutdown: /sbin: /sbin/shutdownhalt:x:7:0:halt: /sbin: /sbin/haltmail:x:8:12:mail: /:news:x:9:13:news: /usr/lib/news:uucp:x:10:14:uucp: /var/spool/uucppublic:operator:x:11:0:operator: /root: /bin/bashgames:x:12:100:games: /usr/games:ftp:x:14:50:: /home/ftp:smmsp:x:25:25:smmsp: /var/spool/clientmqueue:mysql:x:27:27:MySQL: /var/lib/mysql: /bin/bashrpc:x:32:32:RPC portmap user: /: /bin/falsesshd:x:33:33:sshd: /:gdm:x:42:42:GDM: /var/state/gdm: /bin/bashpop:x:90:90:POP: /:nobody:x:99:99:nobody: /:suporte:x:1001:100:,,,: /home/suporte: /bin/bashalias:x:1005:103:: /var/qmail/alias:qmaild:x:1006:103:: /var/qmail:qmaill:x:1007:103:: /var/qmail:qmailp:x:1008:103:: /var/qmail:qmailq:x:1009:104:: /var/qmail:qmailr:x:1010:104:: /var/qmail:qmails:x:1011:104:: /var/qmail:vpopmail:x:89:89:: /var/vpopmail:clamav:x:1012:105:: /home/clamav: /sbin/nologinsamba:x:1013:100:,,,: /home/samba: /bin/basharlen:x:1014:100:,,,: /home/arlen: /bin/bashclientes:x:1015:100:,,,: /home/clientes: /bin/bashrafael:x:1016:106:,,,: /home/rafael: /bin/bashdesenvolvimento:x:1017:106:,,,: /home/desenvolvimento: /bin/bashprosoft:x:1018:100:,,,: /home/prosoft: /bin/bashpostgres:x:1019:107:: /home/postgres:snort:x:70:70:,,,: /home/snort: /bin/falsealan:x:1020:100:,,,: /home/alan: /bin/bashtux:x:1021:100:,,,: /home/tux: /bin/bashmarcelo:x:1022:1

last

Termina imediatamente o loop.

Ex:

1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 my $passwd = "/etc/passwd";
5 open (PASSWD, $passwd);
6 my @users = <PASSWD>;
7 close (PASSWD);
8 foreach (@users) {
9 last if $_ =~ /^mail/;
10 print $_;
11 }

Neste caso, quando alguma linha ($_) começar com a palavra "mail", o last irá terminar o loop e imprimir na tela apenas as linhas anteriores a ela. Como abaixo:

$ perl chomp.pl
root:x:0:0:,,,:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/log:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

next

O operador next descarta alguma ocorrência na lista, como comentários. Ele inicia a próxima iteração do loop.

Ex:

foreach (<arquivo>) {
next if $_ /^#/;
}

Descarta as linhas que iniciam com comentários "#".

split

Busca em uma string por um separador e separa essa string em uma lista de substrings. Os separadores são determinados usando Regex como no exemplo abaixo:

Ex:

1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 print "Digite uma lista de nomes separada por espaço e tecle enter: ";
5 my $nomes = <STDIN>;
6 chomp $nomes;
7 my @lista = split (/ /, "$nomes");

Transformei a escalar "$nomes" numa array "@lista"!

Há inúmeras funções que eu poderia tratar aqui, mas já estou um pouco cansado... :) Fica para uma próxima.

* Vou deixar os HASHES para um próximo artigo.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Exemplos simples
   3. Variáveis
   4. Escalares
   5. Arrays e algumas funções
   6. Documentação
Outros artigos deste autor

Firewall seguro com o IPTables

Matriz <-> Filial com o OpenVPN

Capital Intelectual

Leitura recomendada

Módulos CPAN no Debian e distros GNU/Linux em geral

Programando em Perl (parte 1)

Programando em Perl (parte 2)

Comparação entre Tcl e Perl

Manipulação de sockets em Perl usando o IO::Socket::INET

  
Comentários
[1] Comentário enviado por cguerra em 25/09/2007 - 11:07h

Muito bom o artigo, porém poderia explicar, ou até mesmo exemplicaficar melhor as variaveis...

no caso, usou mais string do que tudo no mundo, e não usamos só string no nosso dia-a-dia, mas mesmo assim está muito bom este artigo, com uma linguagem bem sintetisada e fácil.

abraços.

[2] Comentário enviado por igorcemim em 25/09/2007 - 13:34h

Otimo artigo.
Eu melhorei um script em perl. Se alguem quiser pegar o endereço é:
http://www.vivaolinux.com.br/scripts/verScript.php?codigo=2990

É bom pra quem tah estudando. Ou pra quem que um gerador de senhas seguras.

Abraços

[3] Comentário enviado por f_Candido em 25/09/2007 - 19:39h

Show de Bola. Nunca tinha reparado sobre o PERL, agora vai ser bem útil.
Abraços

[4] Comentário enviado por fabio em 26/09/2007 - 05:37h

Tenho um carinho especial pelo Perl, além de ter sido minha primeira linguagem de programação no Linux, é uma ferramente muito poderosa pra criação de rotinas de manutenção de servidores. Seu suporte a expressões regulares é único!

Ótimo artigo.

[5] Comentário enviado por rafael martins em 26/09/2007 - 06:56h

Obrigado a todos pelos comentários. Com relação ao "suporte a expressões regulares", Fábio, é único mesmo. O Perl interage com as RE's maravilhosamente bem. Utilizo bastante o Perl em conjunto com RE para a manutenção do Firewall (iptables), proxy, controle de banda, só para citar alguns! Vou escrever um próximo artigo sobre Regex para postar na Comunidade. Um abraço a todos.

[6] Comentário enviado por galmeida07 em 26/09/2007 - 08:14h

Existe alguma documentação específica para iniciantes em Perl? Otimo artigo, sempre quis aprender, mas nunca achava nada 'introdutorio'. O brigado e parabéns!

[7] Comentário enviado por rafael martins em 26/09/2007 - 12:49h

Dê uma olhada neste link. Há bons materiais de introdução ao Perl, traduzidos para o Português.

http://www.perl.org.br/bin/view/Perldoc/WebHome

Se você não tiver dificuldades com a Língua Inglesa, veja o link abaixo também.

http://perldoc.perl.org/

O livro da Deitel, "Perl Como Programar" é excelente para quem está iniciando com Perl.. Se você quiser mesmo aprender a linguagem, invista um pouquinho num livro como este..
Um abraço.

[8] Comentário enviado por eskenT em 27/12/2007 - 00:26h

Cara, muito bom o conteudo.
sobre a documentação, o unico problema é que são todos em inglês.
mas também estou dificultando as coisas, programação sem saber inglês não é programação.

[9] Comentário enviado por marcosmiras em 22/01/2008 - 16:44h

Legal... muito bom...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts