• Publicidad

Problema con expresiones regulares

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con expresiones regulares

Notapor hexbase » 2009-07-11 21:17 @928

Hola,

Tengo el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open LANGFILE, 'locale' or die $!;
  2. my @lines = <LANGFILE>;
  3. close(LANGFILE);
  4. if ($string =~  m/es_ES/){
  5. my $langt = "es";
  6. print "es \n";
  7. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Mi problema es que no funciona. El archivo que abre tiene este texto:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. es_ES 
y aun así da como que no encontró esa expresión. ¿Quizás es porque $lines es un escalar?

Help me. :(
hexbase
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-07-11 19:57 @873

Publicidad

Re: Problema con expresiones regulares

Notapor explorer » 2009-07-11 22:56 @997

Bienvenido a los foros de Internet, hexbase.

Siempre es recomendable poner
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

al principio del programa, para que Perl nos avise de posibles errores en la programación.

Por ejemplo, veo que en el código estás leyendo el fichero y guardando cada línea en el arreglo @lines, pero luego no lo usas más.

Luego, en el if() haces referencia al escalar $string, pero no sabemos dónde la has inicializado ni qué valor tiene.

Si, suponemos, que lo que quieres es analizar las líneas del fichero para comparar si en alguna de ellas está el patrón que estás buscando, se podría hacer de esta manera (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open LANGFILE, 'locale' or die $!;
my @lines = <LANGFILE>;
close(LANGFILE);

my $langt = '?';

for my $string (@lines) {
    chomp $string;
    if ($string =~  m/es_ES/) {
        $langt = 'es';
        last;
    }
}
print "$langt\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Fíjate que he añadido un bucle para recorrer todas las líneas leídas del fichero. Por cada una, la almaceno en $string. Le quito el retorno de carro con chomp(). Y ya puedo ver si tiene el patrón buscado. Si lo tiene, cambio el valor de la variable $langt y termino bruscamente el bucle (no hace falta mirar más líneas).
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con expresiones regulares

Notapor hexbase » 2009-07-11 23:17 @012

Gracias explorer, el código funciona.

Yo intentaba en otra prueba hacer esto, pero igual, no andaba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2.  
  3. open LANGFILE, 'locale' or die $!;
  4. my @lines = <LANGFILE>;
  5. close(LANGFILE);
  6.  
  7. if (@lines =~ m/es_/){
  8. print "es \n";
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias por el código y la ayuda.

Edito: ¿Cómo se devuelve el resultado de una subrutina/función?
hexbase
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-07-11 19:57 @873

Re: Problema con expresiones regulares

Notapor kidd » 2009-07-12 10:41 @487

hexbase escribiste:Edito: ¿Cómo se devuelve el resultado de una subrutina/función?


Con return.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $string = toma_string();
  2. my @array = toma_lista();
  3.  
  4. sub toma_string{
  5.     return 'Soy un string';
  6. }
  7.  
  8. sub toma_lista{
  9.     return 'soy','una','lista';
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tutorial: http://perlenespanol.com/tutoriales/fun ... iones.html

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Problema con expresiones regulares

Notapor explorer » 2009-07-12 11:44 @530

hexbase escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (@lines =~ m/es_/) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El error está en que no puedes comparar una lista de valores con un patrón. Debes hacerlo uno a uno

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $linea (@lines) {
    if ($linea =~ m/es_/) {
        # ...
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que también puedes hacer, para abreviar, es usar el módulo List::MoreUtils (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use List::MoreUtils qw(any);

if ( any { m/es_/ } @lines) {
    # ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Finalmente, sí que puedes comparar una lista de valores con un patrón, si usas el Perl v5.10:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use 5.010;
if ( @lines ~~ m/es_/ ) {
    # ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con expresiones regulares

Notapor hexbase » 2009-07-13 16:02 @710

Gracias explorer y kidd por toda la ayuda.
hexbase
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-07-11 19:57 @873


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron