sábado, 8 de diciembre de 2012

Expresiones regulares Perl Parte I/III

Este es un sencillo tutorial sobre algo muy avanzado,que tenemos o llegamos  a usar al escribir algo medio/avanzado en perl,las expresiones regulares las usamos como comprobadores de cadenas,ya sea para realizar una accion con una estructura selectiva o para cambiar el texto.

Cambiar el texto?

Si para cambiar el texto,la realidad las expresiones regulares existen en muchos lenguajes de programación desde PHP que en sus principios creado desde un CGI de C diseñado en Perl,hasta python,C,C++ y claro nuestro legendario lenguaje Perl.

También sin olvidar los regex de la SHELL de Unix(no confundir con wilcards)

Y esta solo es una parte de el poder de las expresiones regulares de Perl.

s///;

Cambiar texto

Delimitadores:

Primero que nada debemos conocer los delimitadores,suena un tanto avanzado pero no es mas que una diagonal  \ esta diagonal debe comenzar por una orden(letra) y debe ir cerrado

En el caso de cambiar texto,es esta la sintaxis

s///;
Como usar?

Como dije es para cambiar texto,si lo queremos ocupar tenemos que definir algo primero,para poder cambiar el valor:


my $variable = "Hola Mundo";

$variable =~ s/Mundo/Perl/; 



Expliquemos eso:

El símbolo =~ quiere decir si encuentra,regresa un valor verdadero

 s/Mundo/Perl/ sustituye Mundo por Perl

Veamos un script


#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

my $variable = "Hola Mundo";

$variable =~ s/Mundo/Perl/; 

print "$variable\n";


El resultado al ejecutar es el siguiente

Debes tener en cuenta que esto s/Mundo/Perl/; es lo que va a sustituir ya que ejecuta esto y veras lo que pasa :

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

my $variable = "Hola Mundo";

$variable =~ s/M/Perl/; 

print "$variable\n";


Lo podemos mejorar:

Ejecuta este script:


#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

my $variable = "Hola Mundo";

print "Tu variable ahora es : $variable\n";

print "Suplantaremos Mundo por: ";

my $suplantar = <STDIN>;

print "Suplantando...";
system("sleep 2;");

chop($suplantar);

$variable =~ s/Mundo/$suplantar/; 

print "\nTu variable ahora es : $variable\n";

Y nos mostrara el proceso :D

Ten en cuenta que esto es muy potente 

Por ejemplo:

Si usamos esta variable "Hola Hola Hola Mundo" y cambiamos Hola así

my $variable = "Hola Hola Hola Mundo";

$variable =~ s/Hola/Hello/;

Solo cambiaría el primer Hola

Pero si los queremos cambiar todos?

Solo vasta con que quede asi la sintaxis

#!/usr/bin/env perl

my $variable = "Hola Hola Hola Mundo";

$variable =~ s/Hola/Hello/ig;

print "$variable\n";

Esto es lo básico de s///

Ya que también se puede usar algo como esto

  1. s/\bgreen\b/mauve/g; # don't change wintergreen
  2. $path =~ s|/usr/bin|/usr/local/bin|;
  3. s/Login: $foo/Login: $bar/; # run-time pattern
  4. ($foo = $bar) =~ s/this/that/; # copy first, then change
  5. ($foo = "$bar") =~ s/this/that/; # convert to string, copy, then change
  6. $foo = $bar =~ s/this/that/r; # Same as above using /r
  7. $foo = $bar =~ s/this/that/r
  8. =~ s/that/the other/r; # Chained substitutes using /r
  9. @foo = map { s/this/that/r } @bar # /r is very useful in maps
  10. $count = ($paragraph =~ s/Mister\b/Mr./g); # get change-count
  11. $_ = 'abc123xyz';
  12. s/\d+/$&*2/e; # yields 'abc246xyz'
  13. s/\d+/sprintf("%5d",$&)/e; # yields 'abc 246xyz'
  14. s/\w/$& x 2/eg; # yields 'aabbcc 224466xxyyzz'
  15. s/%(.)/$percent{$1}/g; # change percent escapes; no /e
  16. s/%(.)/$percent{$1} || $&/ge; # expr now, so /e
  17. s/^=(\w+)/pod($1)/ge; # use function call
  18. $_ = 'abc123xyz';
  19. $a = s/abc/def/r; # $a is 'def123xyz' and
  20. # $_ remains 'abc123xyz'.
  21. # expand variables in $_, but dynamics only, using
  22. # symbolic dereferencing
  23. s/\$(\w+)/${$1}/g;
  24. # Add one to the value of any numbers in the string
  25. s/(\d+)/1 + $1/eg;
  26. # Titlecase words in the last 30 characters only
  27. substr($str, -30) =~ s/\b(\p{Alpha}+)\b/\u\L$1/g;
  28. # This will expand any embedded scalar variable
  29. # (including lexicals) in $_ : First $1 is interpolated
  30. # to the variable name, and then evaluated
  31. s/(\$\w+)/$1/eeg;
  32. # Delete (most) C comments.
  33. $program =~ s {
  34. /\* # Match the opening delimiter.
  35. .*? # Match a minimal number of characters.
  36. \*/ # Match the closing delimiter.
  37. } []gsx;
  38. s/^\s*(.*?)\s*$/$1/; # trim whitespace in $_, expensively
  39. for ($variable) { # trim whitespace in $variable, cheap
  40. s/^\s+//;
  41. s/\s+$//;
  42. }
  43. s/([^ ]*) *([^ ]*)/$2 $1/; # reverse 1st two fields

Pero de momento es todo sobre s///

m//;


Verificador de cadena


Este operador se usa para localicar una expresion(palabra,letra,etc) en una variable, y va sobre una estructura selectiva:

Esta es la sintaxis:

$variable =~ m/palabra/;

Esto en un script va así:


#!/usr/bin/env perl


use warnings;
use utf8;
use strict;


my $variable = "Este es un ejemplo de una cadena para un ejemplo de programación perl de Tiempo de Tux itimetux.com";

# Busquemos perl

if ($variable =~ m/perl/) { print "Se encontro perl en variable\n"}

Lo podemos mejorar :D 

Ejecuten este script,sin ver la variable(copy & paste):



#!/usr/bin/env perl


use warnings;
use utf8;
use strict;


my $variable = "Un ejemplo de expresiones regulares perl en Tiempo de Tux";

print "Hay una variable definida pero esta oculta,que desea buscar: ";

my $buscar = <STDIN>;

print "Buscando...";

system("sleep 2");

chop($buscar);

# Busquemos perl

if ($variable =~ m/$buscar/) {

print "\nSe encontro $buscar en variable\n";

}else {

print "\nNo se encontro $buscar\n";

}

Deben tener en cuenta que esto reconoce minusculas y mayusculas, así que aunque este tiempo en la variable y buscan Tiempo,no lo va a encontrar(veremos después como no limitarnos así).

El verificador =~ tiene su opuesto,ya que este revise un valor verdadero pero hay un valor falso:

!~
Como se pueden imaginar hace lo contrario(checa que no coincida)

Por ejemplo algo un poco tonto,pero para ver como funciona es esto:


#!/usr/bin/env perl


use warnings;
use utf8;
use strict;


my $variable = "Un ejemplo de expresiones regulares perl en Tiempo de Tux";

print "Hay una variable definida pero esta oculta,que desea buscar: ";

my $buscar = <STDIN>;

print "Buscando...";

system("sleep 2");

chop($buscar);

# Busquemos perl
if ($variable !~ m/$buscar/) {

print "\nNo se encontró $buscar\n";

}
elsif ($variable =~ m/$buscar/) {

print "\nSe encontro $buscar en variable\n";

}






Eso es todo por ahora  ya que falta mucho,pero mucho mas de esto :D


6 comentarios:

  1. Esta raro tu PS1 tiene emoticones <('o'<)

    Pásamelo (^▼^)

    ResponderBorrar
    Respuestas
    1. Sabia que te gustaría ver emoticones en la terminal,pero apoco no te puedes programar uno así?

      ^-^ super-tux:~ # echo $PS1

      `if [ $? = 0 ]; then echo \[\e[33m\]"^-^"\[\e[0m\]; else echo \[\e[31m\]"(>_<)"\[\e[0m\]; fi` \[\033[01;32m\]\h:\[\033[01;34m\]\w #\[\033[00m\]

      Bueno la verdad yo tampoco lo hice, lo encontré en:

      http://casidiablo.net/prompts-utiles-bash-linux/

      Pero se ve muy bien :D

      Borrar
    2. Te dejo ese a ti,me puse uno mas poderoso XD

      https://lh4.googleusercontent.com/-TKIozAq2BhA/UMO0FsZTaWI/AAAAAAAAGns/Nk_lXB87GQ0/s641/Captura+de+pantalla+de+2012-12-09+03%3A41%3A08.png


      Borrar
    3. Gracias (^▼^) , pero no era mas fácil poner

      PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]'^-^'\[\e[0m\]; else echo \[\e[31m\]'(>-<)'\[\e[0m\]; fi\` \[\033[01;32m\]\u:\[\033[01;34m\]\w \$\[\033[00m\] "

      Borrar
    4. Si,me equivoque al hacer echo $PS1 no salen todos los símbolos :(

      Por eso mejor usaba grep PS1 ~/.bashrc no se porque se me ocurrió usar echo $PS1

      Borrar
    5. No te preocupes ya quedo ^-^

      https://lh3.googleusercontent.com/-U5HCRUrSbf8/UMTSvcXx9VI/AAAAAAAAAN4/iu_3zr2NVws/w497-h373/uname.png

      Borrar

Los comentarios serán revisados antes de ser publicados.