SPLN
Diário de Bordo - Aula 3 - 2016-02-29
Sumário
- Enviroment $PATH
- Script para criar nova pasta por aula
- Atribuir permissões ao script
- Expressões regulares
- Operadores sobre vários tipos de dados
- Arrays Associativos
- Vetores
- Apontadores (referências!)
- Funções Anónimas
- Perl Open()
- Bash scripts
- Perl scripts
Conteúdo
Enviroment $PATH
* para adicionar mais um caminho podemos:
- executar comando $export PATH='~/bin':$PATH, para adicionar a pasta /bin que se encontra na home folder. Esta alteração funciona apenas na sessão activa.
- para tornar esta alteração permanente linuxmint basta adicionar “export PATH='~/bin':$PATH" ao ficheiro: $sudo vim /etc/bash.bashrc
Script para criar uma nova pasta com data da aula.
#!/bin/bash mkdir $(date +'%m-%d') cd $(date +'%m-%d') exec bash
Atribuir permissões ao script
$chmod 755 <filename> $chmod +x <filename>
Expressões Regulares
Para fazer match do caracter espaço, utiliza-se o seguinte :
\s é equivalente a [ \t\n] \S é equivalente a [^ \t\n]
Utilização do Default input and pattern-searching space:
while( $_ =~ /\S/){...}
while( /\S/ ){...}
Esta expressão regular apanha todas as linha nao vazias. Para aceder a campos da expressão regular que fez match utilizamos a seguinte sintax:
/(\w+)\s+(.+)/
onde as expressões que estão dentro de parênteses curvos são acessiveis através de das variáveis $1..$9.
Operadores sobre vários tipos de dados
Consultar Capiulo 14. do Quick Reference Guide fornecido.
- Arrays Associativos
%a - array associativo (keys %a) devolve as chaves do array defined $a{$const} $delete($a{v3})
- Vetores
@l - vetor unshift(@l, elem ) - insere elemento no inicio do vetor elem = shift(@l) - retira elemento do inicio do vetor push(@l, elem) - insere elemento no final do vetor elem = pop(@l) - retira elemento do final do vetor $l[3] - accesso para o terceiro elemento da lista $l+0 = comprimento da lista @l = split(/a/,"batata") - retorna lista com elementos b,t,t join(',',1..10) - retorna string "1,2,3,4,5,6,7,8,9,10" join(',',@l) - retorna string "$l[0],$l[1],....$l[n]"
- Referências
\@l - devolve referência para o vetor \%a - devolve referêcia para array associativo \&$f - referência para função @x = (1,[3,4]) , $x[1][1] = 3
- Funções Anonimas
$x = sub{ ... } - função anonima
- Perl Open()
open(F,"<","/var/log/messages") - abre ficheiro /var/log/messages para leitura
- Open de IPC (inter process communication: pipes)
#!/usr/bin/perl
open(F, "-|", "ls") or die("Cant open file\n"); while (<>) { print "$. $_"; } close (F);
open(F,">","/var/log/messages") - abre ficheiro /var/log/messages para escrita. open(F,">>","/var/log/messages") - abre ficheiro /var/log/messages e acrescenta no final do ficheiro.
open(F,"-|","ls") - Estamos a criar um Pipe, O stdout do processo2 que é o comando 'ls', retorna-se para o processo1 que é o nosso script
#!/usr/bin/perl
open(F, "-|", "ls") or die("Cant open file\n"); while (<F>) { print "$. $_"; } close (F);
com open(F,”|-“,”ls“) - Estamos a criar um Pipe, O processo 1 pode escrever informação em pipe para o processo 2, usando Descripror 'F'
- Bash script
for a in {1..20000}; do echo $RANDOM >$a.txt; done - cria 20000 ficheiros
* Perl scripts
- imprime linhas repetidas, ignora linhas vazias
#!/usr/bin/perl use warnings; use strict; use utf8::all; my %hash; #array associado while (<>) { if($_ =~ /\S/ and $hash{$_}){ # Se linha não é vazia e é repetida print $_; } else { $hash{$_}++; } }
- Detetar ficheiros duplicados numa diretoria fornecida como argumento.
#!/usr/bin/perl use warnings; use strict; use utf8::all; my %hash; #array associativo my $arg =join ( " ", map{-d $_?"$_/*":$_}@ARGV); open(P, "-|", "md5sum $arg") or die("Cant open file\n"); while (<P>) { if(/(\w+)\s+(.+)/){ # $1 - md5sum; $2 - nome do ficheiro if($hash{$1}){ print "$hash{$1} = $2\n"; } $hash{$1} = $2; } }