• Publicidad

Seleccionar primer campo

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

Seleccionar primer campo

Notapor jmdelcampo » 2008-11-07 08:19 @388

Hola,

Tengo la siguiente línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
KPIS='([^\t]*)\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t([^\t]*)',$DATE=$1,$REQUEST=$2,$USER=$3
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y necesito obtener por un lado KPI y por otro '([^\t]*)\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t([^\t]*)',$DATE=$1,$REQUEST=$2,$USER=$3

Para ello empleo la siguiente línea de código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($field, $value) = split(/\=/, $_);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Evidentemente KPI lo asigna bien, pero el resto de la expresión llega hasta $DATE.

¿Cómo podría resolver el problema?

Saludos y gracias
jmdelcampo
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2006-11-24 07:43 @363

Publicidad

Notapor explorer » 2008-11-07 08:58 @415

Dile a split() que parta solo en dos cachos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($field, $value) = split('=', $_, 2);
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

Notapor jmdelcampo » 2008-11-11 13:22 @599

Gracias explorer,

Después de separar la linea correctamente con la solución que me aportaste, cuando hago un warn() de $value obtengo:
'\'([^\\t]*)\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)',$DATE=$1,$REQUEST=$2,$USER=$3'\'

es decir, que por cada carácter especial lo duplica.

¿Como podría escaparlo de forma que lo asigne correctamente?

Saludos y gracias
jmdelcampo
jmdelcampo
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2006-11-24 07:43 @363

Notapor explorer » 2008-11-11 13:33 @606

Pues a mí eso no me sale... quiero decir que yo lo pruebo en mi máquina y no me duplican los caracteres...
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

Notapor jmdelcampo » 2008-11-12 02:22 @140

Explico un poco mejor el proceso:

Tengo un fichero de configuración del cual voy leyendo y que tiene la siguiente estructura

Código: Seleccionar todo
[paths]
INDEX=1
DIR_BBDD=../bbdd/cae/bbdd_*
KPIS='([^\t]*)\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t([^\t]*)',$DATE=$1,$REQUEST=$2,$USER=$3

[TR]
DIR_BBDD=../bbdd/tr
COMANDO='"ssh logcollector cat /Informatica/ftp_core_r9/logs/profiles/profiles/*.profile | nawk -f awk.file | zip > ../bbdd/tr/bbdd_terminales.gz"'

[PORTAL]
DIR_BBDD=../bbdd/portal
COMANDO='"scp logcollector:/Informatica/ftp_core_r9/logs/portal/currentProject_".$report{fecha_file_remoto}."* ../bbdd/portal/currentProject.portal.gz"'


Mediante el siguiente código voy creando un array de hashes.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while(<FH>){
        next if (m/(^\#)/);
        if (m/^\[(\S+)\]/){
          $name= $1;
  }
  elsif(m/^(\S+)/){
        my ($field, $value) = split('=',$_, 2);
                chop ($value);
                $param->{$field }= $value;
  }
  else {
        next if ($name eq "");
         push(@{$components}, { name => $name, param => $param});
         $name=$param=undef;     
  }
 }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Cuando ejecuto el proceso obtengo que algunos casos en que aparecen caracteres:
Código: Seleccionar todo
 {
            'name' => 'paths',
            'param' => {
                         'INDEX' => '1',
                         'KPIS' => '\'([^\\t]*)\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\',$DATE=$1,$REQUEST=$2,$USER=$3',
                         'DIR_BBDD' => '../bbdd/cae/bbdd_*'
                       }
          },
          {
            'name' => 'TR',
            'param' => {
                         'COMANDO' => '\'"ssh logcollector cat /Informatica/ftp_core_r9/logs/profiles/profiles/*.profile | nawk -f awk.file | zip > ../bbdd/tr/bbdd_terminales.gz"\'',
                         'DIR_BBDD' => '../bbdd/tr'
                       }
          },


Espero haber aclarado un poco más el problema.

Saludos
jmdelcampo
jmdelcampo
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2006-11-24 07:43 @363

Notapor jmdelcampo » 2008-11-12 08:57 @414

Hola de nuevo,

Creo que el error es porque al imprimir el contenido por medio del módulo Data::Dumper, no escapa esos caracteres.

Perdón por las molestias y gracias.

Saludos
Jmdelcampo
jmdelcampo
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2006-11-24 07:43 @363

Notapor explorer » 2008-11-12 09:06 @421

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

my $name;
my $param;
my $components;

open CONFIG, '<kk.txt' or die;

while (<CONFIG>){
    next if /^\#/;

    if (m/^\[(\S+)\]/) {
        $name= $1;
    }
    elsif (m/^(\S+)/) {
        my ($field, $value) = split('=',$_, 2);
        chop($value);
        $param->{$field} = $value;
    }
    else {
        next if $name eq "";
        push(@{$components}, { name => $name, param => $param});
        $name = $param = undef;
    }
}

use Data::Dumper;
print Dumper $components;

print $components->[0]->{param}->{KPIS}, "\n";

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La salida es:
Código: Seleccionar todo
$VAR1 = [
          {
            'name' => 'paths',
            'param' => {
                         'INDEX' => '1',
                         'KPIS' => '\'([^\\t]*)\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\',$DATE=$1,$REQUEST=$2,$USER=$3',
                         'DIR_BBDD' => '../bbdd/cae/bbdd_*'
                       }
          },
          {
            'name' => 'TR',
            'param' => {
                         'COMANDO' => '\'"ssh logcollector cat /Informatica/ftp_core_r9/logs/profiles/profiles/*.profile | nawk -f awk.file | zip > ../bbdd/tr/bbdd_terminales.gz"\'',
                         'DIR_BBDD' => '../bbdd/tr'
                       }
          }
        ];
'([^\t]*)\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t([^\t]*)',$DATE=$1,$REQUEST=$2,$USER=$3

Como ves, sí que se almacena el valor correcto. Otra cosa es lo que te cuenta Data::Dumper. Piensa que Data::Dumper, cuando muestra '\\t' te quiere decir que está guardando dos caracteres: el '\' y el 't'. Si solo mostrara '\t' podríamos confundirlo con un único carácter, el del tabulador horizontal.

Al hacer el último print, sale el valor real.

Otra cosa... para leer ficheros de configuración de ese tipo, ese problema ya está resuelto :wink:

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

use Config::IniFiles;

my $cfg = Config::IniFiles->new( -file => 'kk.txt' );

foreach my $seccion ($cfg->Sections()) {
    print "$seccion\n";

    foreach my $parametro ($cfg->Parameters($seccion)) {
        print "\t", $parametro, " = ", $cfg->val($seccion, $parametro), "\n";
    }
}

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La salida es:
Código: Seleccionar todo
paths
        INDEX = 1
        DIR_BBDD = ../bbdd/cae/bbdd_*
        KPIS = '([^\t]*)\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t([^\t]*)',$DATE=$1,$REQUEST=$2,$USER=$3
TR
        DIR_BBDD = ../bbdd/tr
        COMANDO = '"ssh logcollector cat /Informatica/ftp_core_r9/logs/profiles/profiles/*.profile | nawk -f awk.file | zip > ../bbdd/tr/bbdd_terminales.gz"'
PORTAL
        DIR_BBDD = ../bbdd/portal
        COMANDO = '"scp logcollector:/Informatica/ftp_core_r9/logs/portal/currentProject_".$report{fecha_file_remoto}."* ../bbdd/portal/currentProject.portal.gz"'
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 1 invitado

cron