Documentos de Académico
Documentos de Profesional
Documentos de Cultura
http://www.activestate.com/activeperl/downloads
Editor de texto
– Bloc de notas
– Notepad++ (http://notepad-plus-plus.org/)
– Sublime Text (http://www.sublimetext.com/)
Python – Ruby
“Limitaciones” de Perl
Dificultades de Perl:
• Expresiones regulares
• Referencias a variables
Python :
- POO o lenguaje imperativo
- Sintaxis limpia
Ruby:
- Basado en Perl y Python
- POO
- “Cuestión de gustos”
Perl Básico para Bioinformáticos 9
Estrategias de programación
Estrategias de programación
Encuentro un programa
NAR Database issue (January) y Web Server issue (July)
PubMed
Links de páginas recursos bioinformática (Biocatalogue
http://www.biocatalogue.org/; http://bioinfouab.uab.cat )
Buscadores generales
Bio* proyectos (open bioinformatics projects): bioPerl,
bioJava, bioPython,… (Búsqueda de secuencias por similitud, Búsqueda de motivos
funcionales, Alineamiento múltiple de secuencias, Mapas de restricción, ensamblaje secuencia,
filogenias…)
Pseudocódigo (planteamiento):
Solicitar los números a sumar
Realizar la suma
Mostrar el resultado
Editar
Ejecutar
Guardar y Backups
Cambiar de carpeta
cd nueva_carpeta
C:
#!/usr/bin/perl
# ¡Empezamos!
print "Puedo calcular!\n";
#hacer cálculos
$suma = 3 + 4;
#mostrar el resultado
print "La suma de 3 + 4 es ".$suma."\n";
¡Pruébame!
• Números
1, 49, 28.2, -109, 6.04E23
• Caracteres especiales
"Nueva linea\n<aqui y un tab\t<aqui.\n";
Nueva linea
<aqui y un tab <aqui.
• Matrices (arrays)
Guapa
Enrollado
Lista
• Matrices asociativas (hashes)
$variable1 # correcto
$1variable # incorrecto
• Aritméticos:
+ suma
- resta
* multiplicación
/ división
** exponencial
() agrupación
• Ejemplo
$x = 4;
$y = 2;
$z = 3 + $x * $y; # $z es igual a 11
• No es lo mismo:
$z = 3 + $x * $y # $z es igual a 11
$z = (3 + 4) * 2 ¡Pruébame!
# $z es igual a 14
# $DNA = "ACGGGGAGGACGGGAAATTACTACGGGCATTAGC";
# $LC_DNA = "acggggaggacgggaaattactacgggcattagc";
# $LC_DNA = "acggggaggacgggaaattactacgggcattagc";
# $UC_DNA = "ACGGGGAGGACGGGAAATTACTACGGGCATTAGC";
...
$linea="192a,UAB,GGGTTCC,CCTTAGG";
@campos = split(',',$linea);
No puedes
probarme
@campos = ("192a","UAB","GGGTTCC","CCTTAGG");
$linea_tab = join("\t",@campos);
$linea = "192a,UAB,GGGTTCC,CCTTAGG";
($clone,$lab,$l_oligo,$r_oligo) = split (',',$linea);
Claves Valores
A adenina
C citosina
G guanina
T timina
# alternativamente
%pirimidinas = ();
$pirimidinas{'C'}='Citosina';
$pirimidinas{'T'}='Timina'; No puedes
probarme
# (…) hashes-keys.pl
# Recuperar las claves o los valores en una matriz
%bases = ('A' => 'Adenina',
'C' => 'Citosina',
'G' => 'Guanina');
$bases{'T'} = 'Timina';
No puedes
probarme
@claves = keys(%bases);
@datos = values(%bases);
Función print
#!/usr/bin/perl
# ES.pl
print "Hola mundo!\nPuedo multiplicar: ";
print 6*2;
print "\n";
print "También puedo multiplicar así: ".(6*2)."\n";
C:\>_
#!/usr/bin/perl
# ES.pl
$gen = "Adh";
print "podemos imprimir así: ".$gen."\n";
print "y también así: $gen\n";
¡Pruébame!
C:\> perl ES.pl
podemos imprimir así: Adh
y también así: Adh
C:\>_
C:\>perl ES.pl
Los datos no se pueden interpretar: $gen\n
C:\>_
#!/usr/bin/perl
# ES.pl
$gen = "Adh";
"…"
print "Los datos sí se pueden interpretar: $gen\n";
C:\>perl ES.pl
Los datos sí se pueden interpretar: Adh
¡Pruébame!
C:\>_
Perl Básico para Bioinformáticos 47
Variables de entrada
Entorno: @ARGV
#!/usr/bin/perl
# entorno.pl – Llamada entorno.pl Hola
print $ARGV[0]; # este el primer argumento
Entorno: @ARGV
# (…) entorno.pl
print "1: $ARGV[0] – 2: $ARGV[1] – 3: $ARGV[2]\n";
print "nombre del programa: $0"; # nombre del script
C:\>_
#!/usr/bin/perl
# chomp.pl
print "Entra tu nombre: ";
$nombre = <>; # <> equivale a <STDIN>
print "Hola $nombre!, encantado de conocerte.\n";
C:\>perl chomp.pl
Entra tu nombre: Raquel
Hola Raquel ¿Solución?
!, encantado de conocerte. Pon tu nombre
C:\>_
#!/usr/bin/perl
# chomp.pl
print "Entra tu nombre: ";
$nombre = <>; # <> equivale a <STDIN>
chomp($nombre);
print "Hola $nombre!, encantado de conocerte.\n";
C:\>perl chomp.pl
Entra tu nombre: Raquel ¡Solución!
Hola Raquel!, encantado de conocerte. Pon tu nombre
C:\>_
Función printf
#!/usr/bin/perl
# printf.pl
print "entra tu edad\n";
$edad = <STDIN>;
print "tu edad en años de perro es ",$edad/7,"\n";
C:\>_
Función printf
#!/usr/bin/perl
# printf.pl
print "entra tu edad\n";
$edad = <STDIN>;
printf "tu edad en años de perro es %0.2f \n", $edad/7;
C:\>_
Función printf
%s -> cadena (string)
%d -> dígito (decimal)
%f -> dígito con decimales (float)
#!/usr/bin/perl
# printf.pl
$valor = 1;
printf "realizamos más de %d conversión en %3d %s\n",
$valor, $valor, 'línea'; # mismo número de conversiones!
C:\>perl printf.pl
realizamos más de 1 conversión en 1 línea
C:\>_
• FICHERO: filehandle
• ‘datos.txt’: nombre del fichero
open (FICH_DATOS,'c:\archivosperl\test\test01.dat');
#!/usr/bin/perl
# FileInArray.pl
open (MIFICHERO, "datos.txt");
@contenido = <MIFICHERO>;
# Cargamos el contenido del fichero en una matriz
close (MIFICHERO);
# (...)
chomp (@contenido); ¡Pruébame!
print "linea 1: $contenido[0]\n"; Imprime unas
print "linea 2: $contenido[1]\n"; cuantas líneas
# ...
#!/usr/bin/perl
# EscrituraFicheros.pl
close (FICHERO);
#!/usr/bin/perl
# EscrituraFicheros.pl
open (FICHERO, '>data.txt'); # Crear para escribir
print FICHERO "Linea 1\n";
close (FICHERO);
Linea 1
#!/usr/bin/perl
# EscrituraFicheros.pl
open (FICHERO, '>>data.txt'); # Añade al final
print FICHERO "Linea 2\n";
close (FICHERO);
Linea 1
Linea 2
Perl Básico para Bioinformáticos 62
Escritura en ficheros
#!/usr/bin/perl
# EscrituraFicheros.pl
open (FICHERO, '>data.txt'); # Crear para escribir
print FICHERO "Linea 3\n";
close (FICHERO);
Linea 3
#!/usr/bin/perl
# FileOrDie.pl
open (FICHERO, "EsteFicheroNoExiste.xxx") or
die "No encuentro el fichero";
@lineas = <FICHERO>;
close FICHERO;
print "Hay ".@lineas." líneas";
¡Pruébame!
(sin y con die)
C:\>perl FileOrDie.pl
No encuentro el fichero at FileOrDie.pl line 4.
C:\>_
#!/usr/bin/perl
# if1.pl
print "dime tu edad: "; ¡Pruébame!
$edad = <STDIN>; Con un número
if ($edad <=0) { negativo
print "error al leer la edad. \n";
exit;
}
print "tu edad es $edad\n";
C:\>perl if1.pl
dime tu edad: -20
error al leer la edad. ¡Pruébame!
Pon texto
C:\>_ Pon tu edad
#!/usr/bin/perl
# if1.pl
print "dime tu edad: ";
$edad = <STDIN>;
if ($edad <=0) {
print "error al leer la edad. \n";
exit;
}
print "tu edad es $edad\n";
C:\>perl if1.pl
dime tu edad: hola
error al leer la edad. ¡Pruébame!
Con texto
C:\>_
#!/usr/bin/perl
# if1.pl
print "dime tu edad: ";
$edad = <STDIN>;
if ($edad <=0) {
print "error al leer la edad. \n";
exit;
}
print "tu edad es $edad\n";
C:\>perl if1.pl
dime tu edad: 30
tu edad es 30 ¡Pruébame!
Con la edad
C:\>_
Comparadores numéricos:
== igualdad $a == $b
!= desigualdad
< menor
> mayor
<= menor o igual
>= mayor o igual
0, 1, 2 ,3, …, 9, A, …, Z, a, …, z
C:\>perl if_else.pl
entra tu edad: -5
error en la edad introducida. ¡Pruébame!
Pon un número
negativo
C:\>_
Perl Básico para Bioinformáticos 73
if – else
#!/usr/bin/perl
# if_else.pl
print "entra tu edad: ";
$edad = <>;
if ($edad <= 0){
print "error en la edad introducida.\n";
}
else {
print "tu edad es $edad\n";
}
C:\>perl if_else.pl
entra tu edad: 180
tu edad es 180 ¡Pruébame!
Pon un número
grande
C:\>_
Perl Básico para Bioinformáticos 74
if – else
#!/usr/bin/perl
# if_else.pl
print "entra tu edad: ";
$edad = <>;
if ( ($edad <= 0) or ($edad > 100) ) {
print "error en la edad introducida.\n";
}
else {
print "tu edad es $edad\n";
}
C:\>perl if_else.pl
entra tu edad: 180
error en la edad introducida. ¡Pruébame!
Pon un número
grande
C:\>_
Perl Básico para Bioinformáticos 75
if – elsif – else
#!/usr/bin/perl
# if_elsif.pl
print "Entra tu edad: ";
$edad = <>;
if ( $edad <= 0 ) {
print "eres muy joven para usar un teclado";
}
elsif ( $edad > 100 ) {
print "¿estás seguro? ¡Qué bien te conservas!";
}
else {
print "tu edad es $edad\n";
} ¡Pruébame!
Cambia el valor
#!/usr/bin/perl
# if2.pl
$gen1 = 'X';
$gen2 = 'x';
if ( $gen1 eq $gen2 ) {
print "Son el mismo gen\n";
}
elsif ( $gen1 ne $gen2 ) {
print "Son distintos genes\n";
}
C:\>perl if2.pl
Son distintos genes
¡Pruébame!
C:\>_
#!/usr/bin/perl
# while.pl
$cont = 1;
while ($cont <= 5) {
print "contador $cont\n";
$cont = $cont + 1;
}
C:\>perl while.pl
contador 1
contador 2
contador 3
contador 4
contador 5
¡Pruébame!
C:\>_
Perl Básico para Bioinformáticos 81
Bucle until
#!/usr/bin/perl
# until.pl
$cont = 1;
until ($cont > 5) {
print "contador $cont\n";
$cont = $cont + 1;
}
C:\>perl until.pl
contador 1
contador 2
contador 3
contador 4
contador 5 ¡Pruébame!
C:\>_
Perl Básico para Bioinformáticos 82
Bucle while y ficheros
#!/usr/bin/perl
# Whilefile.pl
$cont = 0;
open(DATOS, "datos.txt");
while (<DATOS>) {
$cont++;
}
close(DATOS);
print $cont."\n";
C:>\perl Whilefile.pl
4
¡Pruébame!
C:\>_
#!/usr/bin/perl
# Whilefile.pl
open(ARCHIVO, "secuencias/seq.fa");
$cont=0;
while (<ARCHIVO>) {
$cont++;
print "Línea número $cont: $_ FIN\n";
}
close(ARCHIVO);
¡Pruébame!
C:\>_
Perl Básico para Bioinformáticos 85
Bucle while y ficheros
#!/usr/bin/perl
# Whilefile.pl
open(ARCHIVO, "secuencias/seq.fa");
$cont=0;
while (<ARCHIVO>) {
$cont++;
chomp($_);
print "Línea número $cont: $_ FIN\n"; ¡Pruébame!
}
close(ARCHIVO);
C:>\perl Whilefile.pl
Línea número 1: >secuencia1 FIN
Línea número 2: ATAGCAGTCGTACCGTAGCCAGCGATCAGA FIN
Línea número 3: TGCGATCGTCTTCGACCAAGCTGACCTGAA FIN
C:\>_
Perl Básico para Bioinformáticos 86
Bucle while y entrada desde teclado
#!/usr/bin/perl
# defined.pl
¡Pruébame!
last sale del bucle inmediatamente
C:\>perl whilehash.pl
A es Adenina
T es Timina
C es Citosina
G es Guanina
¡Pruébame!
C:\>_
#!/usr/bin/perl
# foreach.pl Ya puedes
@bases = ('A','T','C','G'); probarme
foreach $elemento(@bases) {
print "Una de las bases del DNA: $elemento\n";
}
C:\>perl foreach.pl
Una de las bases del DNA: A
Una de las bases del DNA: T
Una de las bases del DNA: C
Una de las bases del DNA: G
¡Pruébame!
C:\>_
C:\>perl foreach.pl
A es Adenina
T es Timina
C es Citosina
G es Guanina ¡Pruébame!
C:\>_
C:\>_
Perl Básico para Bioinformáticos 94
Bucle for
#!/usr/bin/perl
# for.pl
for ($i=0; $i<=5; $i++) {
print "Contador: $i\n";
}
C:\>perl for.pl
Contador: 0
Contador: 1
Contador: 2
Contador: 3
Contador: 4
Contador: 5
¡Pruébame!
C:\>_
#!/usr/bin/perl
# for.pl
for ($i=0; $i<=5; $i++) {
next if ($i==0);
print "Contador: $i\n";
}
C:\>perl for.pl
Contador: 1
Contador: 2
Contador: 3
Contador: 4
Contador: 5
¡Pruébame!
C:\>_
#!/usr/bin/perl
# for_codones.pl
$secuencia = 'ATGATCGTCAGTA'; # ATG ATC GTC AGT A
$num_codones=0;
for ($i=1; $i<=length($secuencia); $i+=3) {
$num_codones++;
}
print "Número de codones: $num_codones";
C:\>perl for_codones.pl
Número de codones: 5
C:\>_
¡Pruébame!
#!/usr/bin/perl
# for_codones2.pl
$secuencia = 'ATGATCGTCAGTA'; # ATG ATC GTC AGT A
$num_codones=0;
for ($i=1; $i<=length($secuencia); $i+=3) {
last if ((length($secuencia)-$i) < 2);
$num_codones++;
}
print "Número de codones: $num_codones";
C:\>perl for_codones2.pl
Número de codones: 4
C:\>_ ¡Pruébame!
#!/usr/bin/perl
# for_matriz.pl Ya puedes
@bases= ('A','T','G','C'); probarme
for ($i=0; $i<=$#bases; $i++) {
print "Una base del DNA es $bases[$i]\n";
}
C:\>perl for_matriz.pl
Una base del DNA es A
Una base del DNA es T
Una base del DNA es G
Una base del DNA es C
¡Pruébame!
C:\>_
$DNA =~ /ATG/;
Operador “s”:
$variable =~ s/A/B/g;
s: operador sustituir
A: patrón a sustituir
B: texto que reemplazará el patrón
g: modificador (en este caso global)
$DNA =~ /ATG/modificadores;
Modificadores:
g → global
i → insensible a mayúsculas
s →el ‘.’ también incluye ‘\n’
#!/usr/bin/perl
# substitute.pl
$dna = 'ACGTACGGTACTAGCAT';
$rna = $dna;
$rna =~s/T/U/i;
print "$dna\n$rna";
C:\>perl substitute.pl
ACGTACGGTACTAGCAT
ACGUACGGTACTAGCAT
C:\>_
¿Solución?
#!/usr/bin/perl
# substitute.pl
$dna = 'ACGTACGGTACTAGCAT';
$rna = $dna;
$rna =~s/T/U/ig;
print "$dna\n$rna";
C:\>perl substitute.pl
ACGTACGGTACTAGCAT
ACGUACGGUACUAGCAU
C:\>_
¡Solución!
#!/usr/bin/perl
# substitute.pl
$dna = 'ACGTACGGTACTAGCAT';
$complementaria = $dna;
$complementaria =~s/A/T/ig;
$complementaria =~s/T/A/ig;
$complementaria =~s/C/G/ig;
$complementaria =~s/G/C/ig;
print "$dna\n$complementaria";
C:\>perl substitute.pl
ACGTACGGTACTAGCAT
ACCAACCCAACAACCAA
C:\>_
¿Solución?
Operador “tr”:
$variable =~ tr/abcd/1234/;
#!/usr/bin/perl
# substitute.pl
$dna = 'ACGTACGGTACTAGCAT';
$complementaria = $dna;
$complementaria =~tr/ATCG/TAGC/;
print "$dna\n$complementaria";
C:\>perl substitute.pl
ACGTACGGTACTAGCAT
TGCATGCCATGATCGTA
C:\>_
¡Solución!
#!/usr/bin/perl
# substitute.pl
$dna = 'ACGTACGGTACTAGCAT';
$dna2 = $dna;
$dna2 =~tr/ATCG/atcg/;
print "$dna\n$dna2";
C:\>perl substitute.pl
ACGTACGGTACTAGCAT
acgtacggtactagcat
C:\>_
¡Solución!
#!/usr/bin/perl
# patterns1.pl
$dna = 'GAGCTGGACATGATTCCACGACA';
if ($dna =~/GATTC/) {
print "EcoRI encontrado!";
}
C:\>perl patterns1.pl
EcoRI encontrado!
C:\>_
¡Pruébame!
#!/usr/bin/perl
# patterns1.pl
if ($dna =~/GATTC/) {
print "EcoRI encontrado!\n";
}
¡Pruébame!
(el 2º patrón)
#!/usr/bin/perl
# grupos_de_caracteres.pl
($dna =~/ATG|ATC|ATA|ATT/)
# es equivalente a:
($dna =~/AT(G|C|A|T)/)
# y es equivalente a:
($dna =~/AT[GCAT]/)
#!/usr/bin/perl
# rangos.pl
/[0123456789]/
# es equivalente a:
/[0-9]/
# y es equivalente a:
/\d/
? 0 o 1 elementos
+ 1 o más elementos
* 0 o más elementos
{N,M} Entre N y M elementos
{N, } Como mínimo N elementos
{ , M} No más de M elementos
{N} N elementos exactamente
– $cp =~/\d\d\d\d\d/; ^
$
Principio de línea
Final de línea
– $cp =~/\d{5}/; \w
\W
Cualquier carácter alfanumérico
Cualquier carácter no-alfanum.
\s Cualquier carácter espaciador
\S Cualquier carácter no-espaciador
\d Cualquier dígito
\D Carácter no dígito
Negar caracteres:
/^ATG/i # Busca el codón inicio al principio
#!/usr/bin/perl
# pattern.pl
$DNI='12345678A';
if ($DNI=~/^[\dXY]\d{7}[A-Z]?$/i) {
print '¡DNI correcto!';
}
C:\>perl pattern.pl
¡DNI correcto!
C:\>_ ¡Solución!
#!/usr/bin/perl
# pattern.pl
$secuencia='AGTCGACTACGA';
if ($secuencia=~/^[GACT]+$/i) {
print 'Es DNA';
}
C:\>perl pattern.pl
Es DNA
C:\>_ ¿Solución?
#!/usr/bin/perl
# pattern.pl
$secuencia='AGTCNGACTACGNA';
if ($secuencia=~/^[GACT]+$/i) {
print 'Es DNA';
}
C:\>perl pattern.pl
C:\>_
¿Solución?
#!/usr/bin/perl
# pattern.pl
$secuencia='ACGTACGGTAGAATTCCTAGCAT';
if ($dna =~/^[GATC]*(GAATTC|AAGCTT)[GATC]*$/) {
# EcoR ó Hind III
print "motivo encontrado!\n";
}
C:\>perl pattern.pl
motivo encontrado!
C:\>_
¡Pruébame!
#!/usr/bin/perl
# pattern2.pl
open(FILE,'secuencia.fas');
while(<FILE>) {
if ($_=~/^>(\S+).*$/) {
$nombre_secuencia=$1;
print $nombre_secuencia;
}
}
close(FILE);
#!/usr/bin/perl
# pattern.pl
@ids=('4725621','38273a','9362618','29753.2');
foreach $id (@ids) {
if ($id !~ /^\d+$/) {
print "el id $id no es válido\n";
}
}
C:\>perl pattern.pl
el id 38273a no es válido
el id 29753.2 no es válido
¡Pruébame!
C:\>_
1) if ($_ =~ /^[GATCNgatcn]+$/)}
{ $length = $length + length $_;
*no recomendado
2) if (/^[GATCNgatcn]+$/)
{ $length = $length + length $_;}
*si recomendado
3) if (/^[GATCN]+$/i)
{ $length = $length + length $_;}
indistinto
4) if (/^[GATCN]+$/i)
{ $length += length $_;}
Función substr:
$fragmento = substr($cadena,$pos_inicial,$longitud);
#!OJO! La primera posición es 0
#!/usr/bin/perl
# substr.pl
$cadena_larga='Hola mundo!';
$fragmento = substr($cadena_larga,2,2);
print "la subcadena '$cadena_larga' es '$fragmento'";
C:\>perl substr.pl
¡Pruébame!
la subcadena de 'Hola mundo!' es 'la' Cambia los números
C:\>_ y usa negativos
Función substr:
$fragmento = substr($cadena,$pos_inicial,$longitud);
# La primera posición es 0
Función index:
$posición = index($cadena_larga,$fragmento);
#!OJO! La primera posición es 0
#!/usr/bin/perl
# index.pl
$abcd='abcdefgh';
$letra='e';
$posicion = index($abcd,$letra);
print "'$letra' empieza en la posición '$posicion'";
C:\>perl index.pl
'e' empieza en la posición '4' ¡Pruébame!
C:\>_
#!/usr/bin/perl
# index.pl
$abcd='abcdefgh';
$letras='efg';
$posicion = index($abcd,$letras);
print "'$letras' empieza en la posición '$posicion'";
C:\>perl index.pl
'efg' empieza en la posición '4'
C:\>_ ¡Pruébame!
#!/usr/bin/perl
# index.pl
$abcd='abcdefgh';
$letras='eg';
$posicion = index($abcd,$letras);
print "'$letras' empieza en la posición '$posicion'";
C:\>perl index.pl
'eg' empieza en la posición '-1'
C:\>_
¡Pruébame!
#!/usr/bin/perl
# indexsubstr.pl
$DNA = 'ATCGCTGACATGCTGGTTACCC';
$codon_inicio = 'ATG';
$posicion = index($DNA,$codon_inicio);
if ($posicion != -1) {
$gen_putativo = substr($DNA,$posicion);
print "posible gen: $gen_putativo";
}
C:\>perl indexsubstr.pl
posible gen: ATGCTGGTTACCC ¡Solución!
C:\>_
#!/usr/bin/perl
# substrbucle.pl
$DNA='ATGTCGCAGGCTCTAACCGAT';
for ($i=0; $i<=(length($DNA)-1); $i+=3) { # length base 1!
$codon = substr($DNA,$i,3); # substr base 0!
print "$codon – ";
}
¡Pruébame!
C:\>perl substrbucle.pl
ATG – TCG – CAG – GCT – CTA – ACC – GAT -
C:\>_
Descripción FASTA:
>M18580 Clone 305A4, complete sequence
/^>(\S+)\s*(.*)$/
$id = $1;
$descripcion = $2;
. Cualquier carácter excepto newline
^ Principio de línea
? 0 ó 1 elementos $ Final de línea
+ 1 ó más elementos \w Cualquier carácter alfanumérico
* 0 ó más elementos \W Cualquier carácter no-alfanum.
{N,M} Entre N y M elementos \s Cualquier carácter espaciador
{N,} Un mínimo de N elementos \S Cualquier carácter no-espaciador
{,M} No más de M elementos \d Cualquier dígito
{N} N elementos exactamente \D Carácter no dígito
#!/usr/bin/perl
# extraer.pl
$nombre='>M18580 Clone 305A4, complete sequence';
if ($nombre =~ /^>(\S+)\s*(.*)$/) {
$id = $1;
$descripcion = $2;
print "el id es '$id'";
}
C:\>perl extraer.pl
el id es 'M18580'
C:\>_
¡Pruébame!
#!/usr/bin/perl
# extraer.pl
$nombre='>M18580 Clone 305A4, complete sequence';
($id,$descripcion)=($nombre =~ /^>(\S+)\s*(.*)$/);
print "el id es '$id'";
C:\>perl extraer.pl
el id es 'M18580'
C:\>_
¡Pruébame!
my
#!/usr/bin/perl
# my.pl
$info='Adh - chr 2L';
if ($info =~/.*chr\s+(.+)/){
my $chr = $1;
print "cromosoma: $chr\n";
}
print "cromosoma: $chr\n";
C:\>perl my.pl
cromosoma: 2L
cromosoma: ¡Pruébame!
C:\>_
#!/usr/bin/perl
# my.pl
$i=5;
for (my $i=0; $i<=3;$i++) {
print "i dentro del bucle: $i\n";
last;
}
print "i fuera del bucle: $i\n";
C:\>perl my.pl
i dentro del bucle: 0
i fuera del bucle: 5
¡Pruébame!
C:\>_
#!/usr/bin/perl
# my.pl
$dna='ATGCGAGGCCT';
if ($dna =~/.*CG[AT]GG.*/) {
my $motivo = 'si';
}
else {
my $motivo = 'no';
}
print "motivo $motivo encontrado";
C:\>perl my.pl
motivo encontrado
¡Pruébame!
C:\>_
use strict;
#!/usr/bin/perl
# strict.pl
use strict;
$contador1=0;
for ($i=0; $i<=3;$i++) {
$comtador1++;
}
print "$contador1";
¡Pruébame!
C:\>perl strict.pl
Global symbol "$contador1" requires explicit package name at prueba.pl line 4.
Global symbol "$i" requires explicit package name at prueba.pl line 5.
Global symbol "$i" requires explicit package name at prueba.pl line 5.
Global symbol "$i" requires explicit package name at prueba.pl line 5.
Global symbol "$comtador1" requires explicit package name at prueba.pl line 7.
Global symbol "$contador1" requires explicit package name at prueba.pl line 9.
Execution of prueba.pl aborted due to compilation errors.
C:\>_
#!/usr/bin/perl
# strict.pl
use strict;
my $contador1=0;
for (my $i=0; $i<=3;$i++) {
$comtador1++;
}
print "$contador1";
¡Pruébame!
C:\>perl strict.pl
Global symbol "$comtador1" requires explicit package name at prueba.pl line 7.
Execution of prueba.pl aborted due to compilation errors.
C:\>_
#!/usr/bin/perl
# strict.pl
use strict;
my $contador1=0;
for (my $i=0; $i<=3;$i++) {
$contador1++;
}
print "$contador1";
¡Pruébame!
C:\>perl strict.pl
4
C:\>_
#!/usr/bin/perl
# strict.pl
use strict;
my $file='C:/archivos_perl/genes.txt';
open(FILE,$file);
while(<FILE>) {
chomp($_); # no es necesario poner 'my'!!
print $_."\n";
}
close(FILE);
sub suma{
# variables que le hemos pasado a la subrutina
my ($valor1, $valor2) = @_;
#!/usr/bin/perl
# PROGRAMA PRINCIPAL
# (VARIABLES DEVUELTAS POR LA SUBRUTINA) =
# NOMBRE_SUBRUTINA (VARIABLES QUE SE PASAN A LA
SUBRUTINA);
$result1 = suma(2,6);
# SUBRUTINA:
# sub NOMBRE_SUBRUTINA {
# my (VARIABLES DE ENTRADA) = @_;
# OPERACIONES
# return(VARIABLES DE SALIDA);
# }
#!/usr/bin/perl
# sort.pl
@numeros=('4', '20', '17', '68', '5'); ¡!
(@num_ordenados) = sort(@numeros);
print "@num_ordenados";
C:\>perl sort.pl
17 20 4 5 68
C:\>_
¡Pruébame!
sub sort_by_number{
# variables que le hemos pasado a la subrutina
my (@array) = @_;
# realizamos las operaciones
my @array_sorted = sort {$a <=> $b}(@array);
# valor que retornamos al programa principal
return (@array_sorted);
} ¡Pruébame!
sub lee_fichero_fasta{
# variables que le hemos pasado a la subrutina
my ($fichero) = @_;
# realizamos las operaciones
# … ¡Pruébame!
Continúa…
# valor que retornamos al programa principal
return (%secuencias);
}
sub seq_aleatoria {
# variables que le hemos pasado a la subrutina
my ($longitud) = @_;
# realizamos las operaciones
my $cadena='';
for (my $i=0; $i<=$longitud; $i++) {
my $num_aleatorio=rand(); #rand(10) int(rand(10))
if ($num_aleatorio < 0.25) {$cadena.='A';}
elsif ($num_aleatorio < 0.5) {$cadena.='T';}
elsif ($num_aleatorio < 0.75) {$cadena.='C';}
else {$cadena.='G';}
}
¡Solución!
# valor que retornamos al programa principal
return($cadena);
}
#!/usr/bin/perl
# secuencias.pl
($secuenciaA) = seq_aleatoria('100');
($secuenciaB) = seq_aleatoria('50'); ¡Solución!
¡Pruébame!
print "Secuencia1:\n$secuenciaA
Secuencia2:\n$secuenciaB\n";
C:\>perl secuencias.pl
Secuencia1:
ATCATAGCGATGTATGTATCGCGCTAGCATCGATCGACCTGATCGACCTGATAGC
CATAGCGTACGTACGTACCTTGACCTAGGCTCAGTCGACTAGCTA
Secuencia2:
TGCTGCGTAGCTGACCGTAGCTACACACAGCTAGTGCTTTGATCGCAGTC
C:\>
ficheros.pm
sub abrir_fichero {
# …
}
sub lee_fichero_fasta {
# …
}
sub lee_fichero_genbank {
# …
}
1;
sub lee_fichero_fasta{
my ($fichero) = @_; # variables que le hemos pasado a la subrutina
my %secuencias=();
# abrimos el fichero llamando a otra subrutina
my (@datos) = abrir_fichero($fichero,'yes'); #nombre fichero y chomp ok
# unimos los elementos del array y los separamos por '>'
my $datos=join('',@datos);
my @seq_prov=split('>',$datos);
foreach my $seq_prov (@seq_prov) { # para cada secuencia:
if ($seq_prov ne '') { # la primera está vacía
my @seq_frag=split('\n',$seq_prov); #separamos por '\n'
my $nombre=shift(@seq_frag); #el primer elemento es el nombre
my $secuencia=join('',@seq_frag); #el resto de la matriz es la sec.
$secuencias{$nombre}=$secuencia; #guardamos nombre y seq en un hash
}
}
return (%secuencias);
}
open(FILE, $fichero);
my @lineas=<FILE>;
close(FILE);
return (@lineas);
}
#!/usr/bin/perl
# minilib.pm
¡Pruébame!
sub suma{
my $valor1 = $_[0];
my $valor2 = $_[1];
return ($valor1 + $valor2);
}
1;
#!/usr/bin/perl #!/usr/bin/perl
# DNA.pm # RNA.pm
Package DNA; Package RNA;
sub complementa{ sub complementa{
#(...) #(...)
} }
1; 1;
Perl Básico para Bioinformáticos 169
Ejercicio Integrador
Ejercicio integrador
168
¿Cómo seguir avanzando
con Perl?
¿Cómo seguir avanzando?
Perl
http://ww.perl.com
Beginners:
http://learn.perl.org