Categorias
Introdução à Programação para Bioinformática com Perl

Strings

Capítulo 3

Este conteúdo faz parte do livro “Introdução à Programação para Bioinformática com Perl“. Você pode adquirir a versão impressa desse livro aqui ou a versão para Kindle aqui. Para nos citar, consulte este link.

Strings são estruturas utilizadas para representar letras, palavras ou textos em geral, ou seja, cadeias de caracteres. Caracteres são símbolos utilizados para representar linguagens textuais na computação. Na prática cada letra de nosso alfabeto, símbolo de pontuação e acentuação, além de outros símbolos especiais como “\n” (quebra de linha), podem ser representados como caracteres.

A tabela ASCII (American Standard Code for Information Interchange ou na tradução para o português “Código Padrão Americano para o Intercâmbio de Informação”) provê uma padronização para que caracteres sejam convertidos para um mesmo código binário, e assim, compreendidos da mesma forma por todos os tipos de computadores. Por exemplo, o caractere “a” tem código decimal ASCII 97, enquanto seu código binário é 01100001.

Você não precisa decorar os códigos da tabela ASCII, mas é importante saber que Perl utiliza essa codificação para ordenação de strings. Por exemplo, o caractere “b” tem código decimal 98. Dessa forma Perl sabe que strings começadas com o caractere “a” devem ser ordenadas antes de strings que iniciam com o caractere “b”.

Em Perl, uma variável do tipo string somente é definida como string na declaração através de aspas simples ou aspas duplas. Na prática isso quer dizer que uma variável declarada como $var = “1” ou $var = ‘1’ será considerada do tipo string, enquanto se declarada como $var = 1, será considerada do tipo inteiro.

Strings são muito importantes em programas para Bioinformática, sobretudo para o tratamento de sequências, tanto de nucleotídeos quando de aminoácidos.

Perl permite que strings declaradas com aspas duplas sejam pré-processadas, ou seja, é possível inserir caracteres especiais ou até mesmo interpolar textos com variáveis.

Perl interpreta strings declaradas com aspas simples como texto puro, ou seja, qualquer caractere especial ou variável serão desprezados.

my $animal = "rato";
my $personagem = "rei";
my $cidade = "Roma";

# Aspas simples
print 'O $animal roeu a roupa do $personagem de $cida-de.\n';
print "\n";

# Aspas duplas
print "O $animal roeu a roupa do $personagem de $cida-de.\n";
print "\n";

Veja que o comando print utilizado com aspas simples exibe a frase: “O $animal roeu a roupa do $personagem de $cidade.\n”. Enquanto, com aspas duplas a frase foi exibida corretamente: “O rato roeu a roupa do rei de Roma.”.

Na prática, variáveis declaradas com aspas simples tendem a ser processadas um pouco mais rápido, entretanto perde-se as vantagens do uso de aspas duplas, além de que caso for necessário imprimir variáveis será preciso concatená-las às strings.

Concatenação de strings

Concatenação ou junção de strings refere-se ao ato de unir duas ou mais strings em uma única. Para concatenar strings deve-se utilizar o operador “.”. Veja:

my $nucleotideo1 = "A";
my $nucleotideo2 = "T";
my $nucleotideo3 = "C";
my $nucleotideo4 = "G";

# Concatenando pares
my $par1 = $nucleotideo1.$ nucleotideo2; #AT
my $par2 = $nucleotideo3.$ nucleotideo4; #CG
print "Pares: $par1 e $par2";
print "\n";

Nesse exemplo, as strings presentes nas variáveis $nucleotideo1 e $nucleotideo2 foram concatenadas e armazenadas na variável $par1. Em seguida, $nucleotideo3 e $nucleotideo4 foram também concatenadas e armazenadas em $par2. A seguir foram impressas interpoladas.

Seria possível obter o mesmo resultado utilizando aspas simples nas partes de puro texto e concatenando as variáveis com o comando:

print 'Pares: '.$par1.' e '.$par2;

Outra forma de concatenar é utilizando o operador “.=”. Nesse caso, uma variável recebe a outra variável. Veja:

$par1 .= $par2;
print $par1; #ATCG

Convertendo letras maiúsculas e minúsculas

Perl possui a função lc, que converte os caracteres de uma string para minúsculo. Possui ainda a função uc, que realiza a tarefa oposta, transformando todos os caracteres em maiúsculo.

my $string = "O rato roeu a roupa do rei de Roma.\n";

print lc $string;
# o rato roeu a roupa do rei de roma.

print uc $string;
# O RATO ROEU A ROUPA DO REI DE ROMA.

Obtendo o tamanho de um texto

Para se obter o tamanho de uma string, Perl fornece a função length. Essa função calcula a quantidade de caracteres presentes na string, contando com espaçamentos.

my $string = "O rato roeu a roupa do rei de Roma.\n";
print length $string;
#36

Buscando substrings em uma string

Uma substring pode ser compreendida como uma parte de uma string. Perl oferece a função index, que recebe como argumento duas strings e retorna posição de ocorrência da segunda string na primeira.

Por exemplo, na frase “O rato roeu a roupa do rei de Roma.”, em que posição aparece a palavra “Roma”?

my $string = "O rato roeu a roupa do rei de Roma.\n";
my $substring = "Roma";
print index($string,$substring); #30

Utilizando a função index podemos descobrir que a palavra “Roma” começa no caractere 30. Podemos ainda utilizar a função length para calcular o tamanho da substring e assim calcular com precisão as posições de início e fim da substring, que no caso seria da posição 30 à posição 33 (30: R; 31: o; 32: m; e 33: a). Lembre-se que a contagem começa do número zero.

A função index também pode receber um terceiro parâmetro que indicará a posição a qual a busca deve começar. Como exemplo, vamos detectar a posição da primeira palavra que comece com o caractere “r” e que apareça após o décimo caractere.

my $string = "O rato roeu a roupa do rei de Roma.\n";
my $substring = "r";

# Imprime a posição do primeiro caractere r apos a posicao 10
print index($string,$substring,10); #14

Após executar o script acima, descobrimos que após a posição 10, temos uma letra “r” na posição 14, entretanto não conseguimos detectar a qual palavra o caractere “r” pertence. Para isso precisamos utilizar uma função que efetue cortes em strings: a função substr.

Dividindo strings com a função substr

Perl permite a divisão de strings através da função substr. A função substr recebe como input (entrada) uma string, uma posição de início para corte e o tamanho do corte.

substr (nome da string, posição de início, tamanho da região cortada);

No exemplo anterior descobrimos que a palavra “Roma” se inicia no caractere 30 da string “O rato roeu a roupa do rei de Roma.”, então vamos utilizar a função substr para realizar a tarefa oposta da função index e gravá-la em uma variável chamada $substring.

my $string = "O rato roeu a roupa do rei de Roma.\n";
my $substring = substr($string, 30, 4);

print $substring; # Roma

A função substr inicia sua contagem na posição 0. Com essa informação é possível realizar diversas tarefas na manipulação de strings. Se quiséssemos remover apenas o primeiro caractere bastaria utilizar o código:

my $string = "O rato roeu a roupa do rei de Roma.\n";
print substr($string, 1); #  rato roeu a roupa do rei de Roma.

Quando desprezamos o terceiro parâmetro (tamanho de corte), a função substr presume que o corte deve ser feito da posição indicada no primeiro parâmetro até o final da string.

É possível ainda utilizar valores negativos no terceiro parâmetro. Nesse caso, substr efetua o corte até a quantidade de caracteres indicada antes do fim da string. Por exemplo, se inseríssemos como terceiro parâmetro o valor -6 ao exemplo anterior, além de eliminar o primeiro caractere, ainda eliminaríamos da nossa substring os caracteres “Roma.”.

my $string = "O rato roeu a roupa do rei de Roma.\n";
print substr($string, 1, -6); #  rato roeu a roupa do rei de

Nesse exemplo, definimos que nossa substring começará depois do primeiro caractere e irá até seis caracteres antes do final da string. Observe que a substring “Roma.” possui somente cinco caracteres, então por que utilizamos o valor -6? Observe que na string original há um caractere especial “\n”, que também é contado.

A função substr também pode ser utilizada para remoção de quebras de linhas indesejadas em strings.

my $string = "O rato roeu a roupa do rei de Roma.\n";

print substr($string, 0, -1); 
#  O rato roeu a roupa do rei de Roma. Caractere \n removi-do.

Podemos ainda utilizar um valor negativo no segundo parâmetro (posição inicial de corte), que indicará que a posição de início será dada a partir da quantidade de caracteres apresentada antes da posição final. Por exemplo, inserindo o valor -6 como segundo parâmetro e desprezando o terceiro parâmetro, obteríamos a substring que aparece a seis caracteres antes do final da string.

my $string = "O rato roeu a roupa do rei de Roma.\n";
print substr($string, -6); #  Roma.\n

Poderíamos ainda inserir um terceiro parâmetro no e extrair apenas quatro caracteres dos seis últimos. Nesse caso, eliminaríamos da substring extraída o ponto final e quebra de linha.

my $string = "O rato roeu a roupa do rei de Roma.\n";
print substr($string, -6, 4); #  Roma

Podemos ainda inserir um quarto parâmetro que permitirá a substituição da substring extraída por uma nova string.

my $string = "O rato roeu a roupa do rei de Roma.\n";

my $substring_1 = substr($string, 2, 4, "tiranossauro"); 
#  rato

my $substring_2 = substr($string, 22, 5, "canela"); 
#  roupa

my $substring_3 = substr($string, -6, 4, "Buenos Aires"); 
#  Roma

print $string;
# O tiranossauro roeu a canela do rei de Buenos Aires.

Nesse caso, perceba que as modificações são realizadas diretamente na variável com a string original. Observe também que não há problema se a string inserida possui um tamanho maior ou menor que o tamanho da string substituída.

Resumo da função substr

my $string = "O rato roeu a roupa do rei de Roma.\n";
print substr($string,0,6);            # O rato
print "\n";
print substr($string,23);             # rei de Roma.
print "\n";
print substr($string,-6);             # Roma.
print "\n";
print substr($string,-13,3);          # rei
print "\n";
print substr($string,-9,-7);          # de
print "\n";
print substr($string,2,4,"cachorro"); # rato

Comparando strings

No primeiro capítulo aprendemos alguns operadores para comparações de strings: eq (igualdade entre strings), ne (diferença entre strings), lt (verifica se uma string apresenta um código ASCII menor), gt (verifica se uma string apresenta um código ASCII maior), le (verifica se uma string apresenta um código ASCII menor ou igual), ge (verifica se uma string apresenta um código ASCII maior ou igual) e cmp (operador de comparações que retorna -1, 0 ou 1 caso a string apresenta um código ASCII menor, igual ou maior, respectivamente).

Quando falamos que uma string apresenta um código ASCII menor ou maior que outra podemos correlacionar isso com uma ordenação alfabética, por exemplo, uma string que começa com o caractere A é ordenada anteriormente a uma string começada com o caractere B, logo A é menor do que B. No exemplo a seguir, aplicaremos diversas comparações entre duas strings chamadas de $str1 e $str2.

my $str1 = "Alanina";
my $str2 = "Aspartato";

# Verificando se strings sao identicas
if($str1 eq $str2){
	print "Strings equivalentes\n";
}

elsif($str1 ne $str2){
	print "Strings diferentes\n";
}

# Verificando ordem alfabetica
if($str1 lt $str2){
	print "\$str1 ordenada alfabeticamente antes de \$str2\n";
}

elsif($str1 gt $str2){
	print "\$str1 ordenada alfabeticamente depois de\$str2\n";
}

# Verificando ordem alfabetica (considera igualdades)
if($str1 le $str2){
	print "\$str1 eh igual ou pode ser ordenada alfabe-ticamente antes de \$str2\n";
}

elsif($str1 ge $str2){
	print "\$str1 eh igual ou pode ser ordenada alfabe-ticamente depois de \$str2\n";
}

# Comparando usando cmp
$cmp = $str1 cmp $str2;

if($cmp == -1){
	print "\$str1 ordenada alfabeticamente antes de \$str2\n";
}

elsif($cmp == 0){
	print "\$str1 igual a \$str2\n";
}

elsif($cmp == 1){
	print "\$str1 ordenada alfabeticamente depois de \$str2\n";
}

else {
	print "Erro na comparacao.\n"
}

Perl é uma linguagem formidável para manipulação de arquivos de texto. Você aprenderá mais sobre isso nos capítulos de manipulação de arquivos e de expressões regulares.

Quer aprender mais? Conheça nossos cursos profissionalizantes à partir de R$19,99:

Nota do autor
Prefácio

Capítulo 1
Introdução ao Perl

Capítulo 2
Comandos condicionais

Capítulo 3
Strings

Capítulo 4
Arrays

Capítulo 5
Laços de repetição

Capítulo 6
Manipulando arquivos

Capítulo 7
Sub-rotinas

Capítulo 8
“O guia de sobrevivência para expressões regulares em Perl”

Capítulo 9
Introdução ao BioPerl

Capítulo 10
Sequências

Capítulo 11
BLAST

Capítulo 12
Estruturas de proteínas

Capítulo 13
Hierarquia do BioPerl

Epílogo
Referências bibliográficas
Sobre os autores

Por favor, nos cite:

MARIANO, DIEGO CÉSAR BATISTA; de MELO-MINARDI, R. C. . Introdução à Programação para Bioinformática com Perl. 1. ed. North Charleston, SC (EUA): CreateSpace Independent Publishing Platform, 2016. v. 2. 200p .

Por Diego Mariano

Doutor em Bioinformática pela Universidade Federal de Minas Gerais com atuação na área de ciência de dados e aprendizado de máquina aplicados ao aperfeiçoamento de enzimas usadas na produção de biocombustíveis. Mestre em Bioinformática, também pela UFMG, atuando na área de desenvolvimento de sistemas Web para montagem de genomas. Atualmente realiza estágio pós-doutoral no Departamento de Ciência da Computação da UFMG com foco em desenvolvimento de sistemas Web para Bioinformática, análise exploratória e visualização de dados. Tem conhecimentos nas linguagens: PHP, JavaScript, Python, R, Perl, HTML, CSS e SQL.