Arquivo

Archive for the ‘Funções’ Category

Split: Dividindo uma String

21 fevereiro, 2009 2 comentários

Uma tarefa muito comum quando utilizamos o Perl para manipular textos é o de separar e dividir uma String – seja ela uma palavra ou uma frase. O split é uma função nativa do Perl que realiza com extrema eficiência esta tarefa. Dado uma String e uma condição, ele realiza uma varredura na String a procura de algo que corresponda o que for definido na regex da condição. Conforme vão sendo encontrados resultados, o split vai retornando os mesmos. Veja sua sintaxe:

($retorno1,$retorno2) = split (/[condição]/,$frase,$limite);

  • As variáveis $retorno1 e $retorno2 receberão os dois dados que forem separados, cada um para a respectiva variável.
  • A condição pode ser expressa em forma de String ou expressão regular (regex) (Veja a tabela de regex).
  • O limite é um parâmetro opcional que só precisa ser definido se for necessário limitar o número de retornos.

No split podemos especificar quantas variáveis de retorno quisermos. Se o número de dados retornados for indefinido, podemos definiro retorno para uma array, da seguinte forma:

(@retornos) = split (/[condição]/,$frase,$limite);

Vejamos alguns exemplos práticos sobre como funciona o split:

$frase = “Campinas – SP”;
($cidade,$estado) = split(” – “,$frase); # Divide a frase por ” – ”

print “Eu moro em $cidade que fica no estado de $estado”;

O exemplo acima produzirá o seguinte resultado:

Eu moro em Campinas que fica no estado de SP


Podemos também usar regex para expressar as condições.
Digamos que temos uma String e queremos separá-la pelos números contidos nela.
Podemos usar a regex d+ que identifica os numeros contidos na String. Veja um exemplo:

$frase = “ABC1DEF2GHI”;
($div1,$div2,$div3) = split(/d+/,$frase,3);

print $div1.”n”;   print $div2.”n”;   print $div3.”n”;

O código acima mostrará o seguinte na tela:

ABC DEF GHI


Como último exemplo, podemos fazer uma separação de vários ítens de uma String.
Vamos pegar uma frase longa que não sabemos o número de retornos.

$frase = “O-rato-roeu-a-roupa-do-Rei-de-Roma”;
(@novaFrase) = split(/-/,$frase); # O retorno é feito na array @novaFrase

print $novaFrase[0].”n”;
print $novaFrase[1].”n”;
print $novaFrase[2].”n”;
(…)
print $novaFrase[8].”n”;

Isto irá separar a frase por e produzirá o seguinte resultado na tela:

O rato roeu a roupa do Rei de Roma

Note que não informamos ao split o número de variáveis que seriam retornadas e nem mesmo o limite, pois  tudo que ele for encontrando ele já vai incluindo na array especificada.
Para obtermos o valor, basta acessar o array informando suas respectivas posições para encontrar os ítens retornados.

Enfim, o split é certamente uma das funções mais importantes do Perl, e um fator que faz de nossa linguagem ser a melhor quando o assunto é manipulação de texto.

Até a próxima!

Anúncios

Descobrindo Anos Bissextos

Este código pode lhe ser útil caso você esteja trabalhando com datas, calendários ou algo do tipo.

Se você quer saber se um determinado ano é bissexto ou não, esta função lhe dará precisamente a resposta.

Basta chamá-la passando o ano por parâmetro, assim:

isBissexto([ANO])

O retorno dessa função é um boolean (0 ou 1), indicando verdadeiro para anos bissextos.

A função:

sub isBissexto(){
          my $ano = $_[0];
          if ($ano%400==0){
            return 1;
          }elsif ($ano%4==0 && $ano%100!=0){
            return 1;
          }else{
            return 0;
          }
}

Veja o Código Completo
(func-isbissexto.pl)

#!/usr/bin/perl

print &isBissexto(1996);
# Mostrará na tela '1', pois 1996 é um ano bissexto.

sub isBissexto(){
        my $ano = $_[0];

        if ($ano%400==0){
            return 1;
        }elsif ($ano%4==0 && $ano%100!=0){
            return 1;
        }else{
            return 0;
        }
}

Descobrindo o Dia da Semana

Olá, estreiando nossa parte sobre Funções, um código para obter o dia da semana de qualquer data.

Seu funcionamento é muito simples. Você chama a função, informando uma data por parâmetro, e ela lhe retorna um número correspondente à data, dessa forma:

Retorna 0 se Domingo
Retorna 1 se Segunda
Retorna 2 se Terça
Retorna 3 se Quarta
Retorna 4 se Quinta
Retorna 5 se Sexta
Retorna 6 se Sábado

Para obter o resultado, devemos passar os três argumentos que correspondem ao dia, mes e ano, assim:

diaSemana([DIA,][MES,][ANO]);

Vamos ver agora como fica o corpo da função:

sub diaSemana(){
           my $dia = $_[0];
           my $mes = $_[1];
           my $ano = $_[2];
           my $d_semana=0;
           $d_semana=$ano+$dia+3*($mes-1)-1;
           if($mes<3){$ano--;}
           else{$d_semana-=int(0.4*$mes+2.3);}
           $d_semana+=int(($ano/4)-int((($ano/100+1)*0.75)));
           $d_semana%=7;
           return $d_semana;
}

Note que para pegar os argumentos, o Perl usa a array especial @_

Assim, em nosso script, para obter os três argumentos iniciais, informamos diretamente a posição destes ($_[0], $_[1] e $_[2]) para as respectivas variáveis locais (my) de destino.


Veja Funcionando:

[ Que Dia da Semana Caiu? ]


Veja o Código Completo:
(func-diasemana.pl)

#!/usr/bin/perl

print &diaSemana(13,4,2008);
# Mostrará na tela '0', porque 13/4/2008 caiu num Domingo.

sub diaSemana(){
           my $dia = $_[0];
           my $mes = $_[1];
           my $ano = $_[2];
           my $d_semana=0;
           $d_semana=$ano+$dia+3*($mes-1)-1;
           if($mes<3){$ano--;}
           else{$d_semana-=int(0.4*$mes+2.3);}
           $d_semana+=int(($ano/4)-int((($ano/100+1)*0.75)));
           $d_semana%=7;
           return $d_semana;
}