User Tools

Site Tools


spln2016:dirio3

This is an old revision of the document!


SPLN

Diário de Bordo - Aula 3 - 2016-03-01

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]"

** Apontadores

\@l - devolve apontador para o vetor
\%a - devolve apontador para array associativo
\&$f - apontador para função
@x = (1,[3,4]) ,  $x[1][1] = 3

* Funções Anonimas

$sub{ ... } - função anonima

* Perl Open()

open(F,"<","/var/log/messages") - abre ficheiro /var/log/messages para leitura

#!/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);
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;
	}
}
spln2016/dirio3.1457120322.txt.gz · Last modified: 2016/03/04 20:38 by ambs