• Publicidad

Separar un string según una expresión regular

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

Separar un string según una expresión regular

Notapor perleando_apenas » 2009-04-27 18:28 @811

Saludos a todos.

Amigos, tengo un problema que no sé cómo atacar. Tengo un script en Perl que deberá recibir un parámetro de la forma:
Código: Seleccionar todo
[[string_alfanumerico][string_inicial.XXXXXXX.string_final][string_o_numero]]


Aplicando regexp, obtengo en una variable $var esto:
Código: Seleccionar todo
string_inicial.XXXXXXX.string_final


Donde XXXXXXX puede ser uno o más strings separados por "." (un punto).

Lo que yo necesito hacer con Perl es poder obtener estos distintos strings en un array.

Lo que pude hacer es contar cuántos strings hay separados por "." en $var haciendo esto (que copié de otro foro aquí mismo):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$count++ while $var =~ /\./g;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El menor valor posible para $count es 3, lo que significa que en XXXXXXX hay sólo un string; si es 4, hay 2; si es 5, hay 3,... etc.

Al querer separar XXXXXXX, no logro hacerlo con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$var =~ /^\S+\.(\S+)\.\S+$/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Quisiera saber si me pueden ayudar a separar estos campos y ponerlos en un array.

Muchas gracias.
perleando_apenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2009-04-17 10:27 @477

Publicidad

Notapor explorer » 2009-04-27 18:41 @820

Yo probaría a usar split():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;

my $var = 'string_inicial.XXXX.XX.X.string_final';

my @strings = split '[.]', $var;

@strings = @strings[1 .. $#strings-1];  # quitamos los extremos

print join '-', @strings;               # XXXX-XX-X
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Pequeña duda...

Notapor perleando_apenas » 2009-04-28 09:59 @457

Muchas gracias, explorer por tu respuesta.

Pero me quedo con una duda: en la llamada a split(), ¿cuál es la diferencia entre usar '[.]' y usar '\.'?
perleando_apenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2009-04-17 10:27 @477

Notapor explorer » 2009-04-28 10:24 @475

No hay diferencias en la solución del problema. Lo que cambia es la notación.

Con '[.]' estamos usando una 'clase' de caracteres. Quiere decir que estamos buscando uno cualquiera de los caracteres que están entre los corchetes. Como solo hay uno, pues ese: un punto.

Con '\.' estamos buscando un literal compuesto de un carácter: un punto.

Perl te permite elegir el que más te guste.

Actualización: que quede claro que el primer argumento de split() es una expresión regular, no una cadena de caracteres (salvo el caso especial " ").
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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

cron