Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Seleccionar primer campo

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Vie Nov 07, 2008 7:19 am
jmdelcampo
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Nov 2006
Mensajes: 21
Seleccionar primer campo Responder citando

Hola,

Tengo la siguiente línea
Perl:
KPIS='([^\t]*)\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t([^\t]*)',$DATE=$1,$REQUEST=$2,$USER=$3


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:
Perl:
my ($field, $value) = split(/\=/, $_);


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
Mensaje Vie Nov 07, 2008 7:58 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

Dile a split() que parta solo en dos cachos:
Perl:
my ($field, $value) = split('=', $_, 2);
Mensaje Mar Nov 11, 2008 12:22 pm
jmdelcampo
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Nov 2006
Mensajes: 21
Responder citando

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
Mensaje Mar Nov 11, 2008 12:33 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

Pues a mí eso no me sale... quiero decir que yo lo pruebo en mi máquina y no me duplican los caracteres...
Mensaje Mie Nov 12, 2008 1:22 am
jmdelcampo
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Nov 2006
Mensajes: 21
Responder citando

Explico un poco mejor el proceso:

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

Código:
[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.

Perl:
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;  
  }
 }


Cuando ejecuto el proceso obtengo que algunos casos en que aparecen caracteres:
Código:
 {
            '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
Mensaje Mie Nov 12, 2008 7:57 am
jmdelcampo
Perlero Nuevo
Perlero Nuevo
Registrado: 24 Nov 2006
Mensajes: 21
Responder citando

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
Mensaje Mie Nov 12, 2008 8:06 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

Prueba con esto:
Perl:
#!/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__
La salida es:
Código:
$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

Perl:
#!/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__
La salida es:
Código:
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"'
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group