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.