Perl en Español

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

Formatos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Vie Jul 04, 2008 2:46 am
STM
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Jul 2008
Mensajes: 14
Formatos Responder citando

Hola, buen día.

¿Podrían ustedes decirme si yo puedo crear un nuevo archivo en Perl que tenga dos archivos fuentes?

¿Pudiendo seleccionar de cada uno los datos que se necesitan y escribirlos en el programa final en un formato dado?

Muchas Gracias

Hasta Luego
Mensaje Vie Jul 04, 2008 2:57 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

Pues no, no sabemos si eres capaz de crear ese programa Perl... Very Happy

Lo que sí es seguro es que sí se puede hacer. Es un trabajo normal de filtrado o procesamiento por líneas. Si nos das más datos, podríamos ayudarte.
Mensaje Vie Jul 04, 2008 3:09 am
STM
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Jul 2008
Mensajes: 14
Formatos Responder citando

Hola de nuevo,

En realidad creo que existe una manera más fácil de trabajar mi código.

En realidad lo que necesito es hacer una duplicación de datos (columna 1 y 3). Por ejemplo, la primera línea tengo:
Código:
RANA.WIDTH   minWiidth   RANA


El punto es que cada línea es diferente y no sé cómo hacer una función automática que pregunte:

¿Cuál es la palabra antes del punto en la columna uno, la memorice y la ponga en la columna tres?

Porque la expresión "m// " no creo que me sirva, y tampoco la función "pos", o "quotemeta" que son las únicas que conozco.

Muchas Gracias.
Mensaje Vie Jul 04, 2008 3:33 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

Algo como esto:

Perl:
while ( <FICHERO> ) {

    @campos = split;

    if ( $campos[0] =~ /(.+)\./ ) {
         $campos[2] = $1'.' . $campos[2];
    }

    print join "\t", @campos;
}
Mensaje Vie Jul 04, 2008 8:43 am
STM
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Jul 2008
Mensajes: 14
Responder citando

Hola.
¿Podría por favor explicarme qué significan las dos líneas del if? porque no entendí.
Cómo es que él reconoce mi palabra y la copia... yo sé que la $1 va guardar la información obtenida por la línea anterior, ¿pero esos puntos?
¿Y el split va a separar mi línea en varias partes según los espacios en blanco que encuentre?

Muchas Gracias
Mensaje Vie Jul 04, 2008 9:24 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

Perl:
    if ( $campos[0] =~ /(.+)\./ ) {
         $campos[2] = $1'.' . $campos[2];
    }

La línea del if está comprobando si el primer campo coincide (=~) con un patrón de búsqueda. Ese patrón es /(.+)\./ que quiere decir que nos quedamos (()) con todo (.+) lo que hay delante de un punto (\.).

Si hemos encontrado ese patrón, se ejecuta la siguiente línea.

La siguiente línea asigna un nuevo valor al tercer campo. Ese nuevo valor es: lo que hemos capturado antes en el primer par de paréntesis del patrón ($1), seguido de un punto y seguido de lo que era antes el tercer campo (usamos el operador punto para hacer concatenación de cadenas de caracteres).

El split, sin ningún parámetro, divide $_ (la línea del fichero en este caso), por los espacios en blanco que separan los campos. Y da lo mismo que sean espacios en blanco o tabuladores.
Mensaje Lun Jul 07, 2008 3:26 am
STM
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Jul 2008
Mensajes: 14
Sintaxis Responder citando

Hola,
Buen Día,

¿Podrían ayudarme a identificar cuál es el error de sintaxis por el cual el programa no se ejecuta?

Porque hay un problema de reconocimiento de la sintaxis; yo la he cambiado varias veces, pero no funciona. En realidad Perl muestra el código en colores para ayudar al programador, pero el problema es que yo no he encontrado la significación de los colores y me encuentro trabajando a la suerte porque no la comprendo.

Este es el error que muestra el sistema:
Código:
syntax error at techfile.pl line 45, near "+)"
Execution of techfile.pl aborted due to compilation errors.


Anexo el código de mi programa:
Perl:
#!/usr/bin/perl
use strict;
use warnings;

my (@column);

#variables
my ($ip1,$ip4, $ip5,$ip6);

# Open files
open (IN,  "<CMOS065.txt") or die "$!\n";
open (BRA, ">bra065.txt") or die "$!\n";   

# Definition format
format BRA =
 @<<<< (  @<<<<<<<<<<<<< @<<<<<<<< @<<<<<<<<<<< @<<<<<< )
 $ip4,        $ip1,                        ,$ip6             ,undef                  ,$ip5
.

# format BRA_Top

format BRA_TOP =
 physicalRules("default"\n
   spacingRules(
 #;ID          rule                                    value
 #;---------(------------------------------------------------)
.   

# Reader the file IN,
while ( <IN> ) {

    @column = split;
   
    if ($column[0] = ~/(.+)\./) {
   
        $column[2] = $1'.' . $column[2];
         
         #$ip6 = $column[2];
   
    if (\d+)/ ;
   
    next if /</;
    next if /d/;
    next if /^#/;
    next if /^$/;
    next if /l/;

    next if /G/;
    next if /D/;
    next if /m /;
    next if /step/;
    next if /enc/;
    next if /ext_on/;
    next if /nalw/;
    next if /ovlp/;
       
    #chop;
    #next if /^density/;
    # selection lines with  "w,spc,area"
   
         
    if ( /w|area|spc/i ) {
   
   
        # replace of syntax
         s/w/minWidth/g;
         s/area/minArea/g;
         s/spc/minSpacing/g;
         
       

        # Division of line, and  I take three parts of six parts
        #($ip1,undef,undef,$ip4,$ip5, $ip6) = split;

        # Writer file of out according to format
        write BRA;
       # print join "\t", @column;
  }
 
 }
 
}

# close of files
close IN;
close BRA;


Muchas Gracias de antemano por la ayuda prestada.

Hasta Luego
Mensaje Lun Jul 07, 2008 3:38 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

1.
Donde dice:
Perl:
if ($column[0] = ~/(.+)\./) {

debe decir
Perl:
if ($column[0] =~ /(.+)\./) {


2. Ese mismo if no está cerrado con la llave final '}', salvo que hayas copiado mal el programa.

3.
La línea
Perl:
    if (\d+)/ ;

no quiere decir nada. Es un error completo. Yo creo que quieres filtrar las líneas que contienen números. En ese caso, esa línea sería:
Perl:
    next if /\d+/;


4.
Lo que no sé es por qué en el último if haces sustituciones de la variable $_ y luego, en el write, estás usando las variables $ipX.
Mensaje Lun Jul 07, 2008 6:20 am
STM
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Jul 2008
Mensajes: 14
Responder citando

Hola,

Yo escribí la siguiente expresión, con la finalidad de preguntar qué cadena de caracteres hay antes del punto en la variable $ip4 y de copiarla en la variable $i3,
La variable $ip4=OD.W.1, entonces la idea sería obtener el OD y copiarlo en $i3.

Perl:
if ($ip4 = m/(.).\ /g) {
   
    $i3=$1


pero como hay dos puntos esta expresión toma los caracteres que hay antes del segundo punto y no antes del primero, o sea:
$i3= w (y aparte lo escribe en minúscula). ¿Cómo se le podría especificar que lo que se desea copiar es lo que hay antes del primer punto? Intenté eliminando la "g" de las instrucciones pero no cambió el resultado.

Muchas Gracias
Mensaje Lun Jul 07, 2008 6:58 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

Hay que cambiar la expresión regular para capturar esos casos (y los anteriores)
Perl:
#!/usr/bin/perl

my @pruebas = (
    'RANA.WIDTH   minWiidth   RANA',
    'OD.W.1       otracosa    RARO',
);

foreach ( @pruebas )  {

    my ($ip4, $ip5, $ip6) = split;

    if ($ip4 =~ /([^.]+)\./ ) {
        $ip6 = $1 . '.' . $ip6;
    }

    print join "\t", ($ip4, $ip5, $ip6);
    print "\n";
}
Sale:
Código:
RANA.WIDTH      minWiidth       RANA.RANA
OD.W.1  otracosa        OD.RARO

El cambio que hemos hecho en la expresión regular es:
Nos quedamos con todo (+) lo que no sea un punto ([^.]) que esté delante de un punto (\.).
Mensaje Lun Jul 07, 2008 9:24 am
STM
Perlero Nuevo
Perlero Nuevo
Registrado: 01 Jul 2008
Mensajes: 14
Funcion copiar Responder citando

Hola de nuevo,
Muchas Gracias por el código.

Desearía hacer otra pregunta: en el archivo yo tengo la línea siguiente, en el archivo fuente:
Código:
OD.W.x      2.0

pero en el archivo final ella debe cuadriplicarse y pasar a ser:
Código:
OD.W.1      2.0
OD.W.2      2.0
OD.W.3      2.0
OD.W.4      2.0

pero no sé cómo programar eso en Perl.

¿Cuál es la instrucción que me permite copiar y pegar?

Muchas Gracias de antemano.
Mensaje Lun Jul 07, 2008 10:51 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

Podrías copiar y pegar usando expresiones regulares. Pero creo que es más fácil hacerlo así: quitamos la parte final de ese campo y luego hacemos un bucle que vaya colocando números consecutivos:

Perl:
#!/usr/bin/perl

my $linea = "OD.W.x      2.0\n";

my @campos = split " ", $linea;

$campos[0] =~ s/[^.]+$//;

foreach ( 1 .. 4 ) {
    print "$campos[0]$_     $campos[1]\n";
}
Sale:
Código:
OD.W.1     2.0
OD.W.2     2.0
OD.W.3     2.0
OD.W.4     2.0

Lo que hace la expresión regular es quitarle, al primer campo, toda (+) su parte final ($) que no sea un punto ([^.]).

Naturalmente, esta es una de las múltiples soluciones al problema. Seguro que hay más.
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