• Publicidad

Problema con una cadena

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problema con una cadena

Notapor kernel19 » 2009-04-26 15:53 @703

Bueno, un saludo, por aquí de nuevo en el foro.
Muchachos, tengo una pregunta, tengo un problema con una cadena necesito cortarla de tres en tres. Intenté hacer esto pero no me funcionó.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$var1  = "cadenaaaaaaaaaaaaaaaa";
$j = length($var1);

for($i = 0; $i < $j; $i++) {
    if (($i % 3) == 0)
        @array = split("", $var1);
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Hago esto pero cuando trato de imprimir el array no me muestra las variables de tres en tres sino todas seguidas.

Quisiera saber que me pueden aconsejar para cortarla de tres en tres.

Gracias :wink: :wink:
kernel19
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-12-08 10:51 @493

Publicidad

Notapor creating021 » 2009-04-26 17:07 @755

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
my $a = "012345678";
for ( my $i = 0; $i < length $a; $i += 3 ) {
    print ( (substr $a, $i, 3) . "\n");
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El código que pones no funciona porque split separa los caracteres de una variable según una referencia que le vos indicas (en este caso "").

Otra forma de hacerlo es con unpack
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $a = "012345678";
my $formato = "a3" x (( length $a ) / 3 );
print ( join "\n", ( unpack $formato, $a ) );
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La cosa es que la variable tiene que ser divisible por 3.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2009-04-26 18:40 @819

Te faltan poner las llaves en el if(). No almacenas cada trozo como elemento del @array. Eso se hace fácil con push(). Y en vez de split(), puedes sacar el trozo con substr().

Queda:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$var1  = "cadena123456789abcdef";
$j = length($var1);

for($i = 0; $i < $j; $i++) {
    if (($i % 3) == 0) {
        push @array, substr($var1, $i, 3);
    }
}

use Data::Dumper;
print Dumper \@array;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sale:
Código: Seleccionar todo
$VAR1 = [
          'cad',
          'ena',
          '123',
          '456',
          '789',
          'abc',
          'def'
        ];

Ahora bien, ir incrementando la variable $i de uno en uno, y a la vez comprobar si es múltiplo de 3, pues se puede reducir a lo que te dice creating021:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for($i = 0; $i < $j; $ i+= 3) {
    push @array, substr($var1, $i, 3);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Se puede hacer de muchas formas. Incluso hasta con expresiones regulares:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($var1 =~  m/(...)/g) {
    push @array, $1;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El problema, en esta solución, es si la cadena no es de longitud múltiplo de 3, pues entonces no captura el final.

Una forma de resolverlo es ajustando un poco más la expresión regular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($var1 =~  m/(.{1,3})/g) {
    push @array, $1;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
en la que buscamos bloques de entre 1 y 3 caracteres. La expresión regular siempre intentará escoger el bloque mayor (el de 3 caracteres), pero en el último bloque puede que no sea así, por lo que capturará los que resten, sea uno o dos caracteres.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Muchas gracias

Notapor kernel19 » 2009-04-26 20:02 @877

¡Hey!, muchachos. Muchas gracias me han servido un resto ya las probé todas y me han servido de lujo.

El problema, en esta solución, es si la cadena no es de longitud múltiplo de 3, pues entonces no captura el final.


De acuerdo a tu comentario, explorer, no importa si queda una truncada. La intención es buscar un patrón en esa secuencia de N valores, pero les agradezco un resto. La verdad no conocía la función substr();
por eso no me daba; pero gracias una vez más, muchachos. Me sirvió bastante. Gracias :wink: :wink: :wink: :wink: :wink:
kernel19
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-12-08 10:51 @493

Re: Problema con una cadena

Notapor reLlene » 2012-06-21 10:37 @484

Tengo una duda: en el siguiente segmento de código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (($i % 3) == 0) {....
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿cuál sería la semántica de la condición en este caso? Si la variable $i es divisible por 3 :? en ese caso entraría en acción push(), pero si $i toma el valor 2, por ejemplo, no lo estaría haciendo. ¿¿¿No es así??? :?
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Re: Problema con una cadena

Notapor explorer » 2012-06-21 10:49 @492

Pues sí, así es: solo nos interesa que entre en el push() cuando $i sea divisible por 3 (entonces, el resto de la división entera es 0).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado