====== 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 $chmod +x **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 () { 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 (

) { if(/(\w+)\s+(.+)/){ # $1 - md5sum; $2 - nome do ficheiro if($hash{$1}){ print "$hash{$1} = $2\n"; } $hash{$1} = $2; } }