• Publicidad

Formatos

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

Formatos

Notapor STM » 2008-07-04 03:46 @199

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
STM
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2008-07-01 07:12 @342

Publicidad

Notapor explorer » 2008-07-04 03:57 @206

Pues no, no sabemos si eres capaz de crear ese programa Perl... :D

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.
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

Formatos

Notapor STM » 2008-07-04 04:09 @215

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: Seleccionar todo
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.
STM
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2008-07-01 07:12 @342

Notapor explorer » 2008-07-04 04:33 @231

Algo como esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ( <FICHERO> ) {

    @campos = split;

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

    print join "\t", @campos;
}
Coloreado en 0.002 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor STM » 2008-07-04 09:43 @446

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
STM
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2008-07-01 07:12 @342

Notapor explorer » 2008-07-04 10:24 @475

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    if ( $campos[0] =~ /(.+)\./ ) {
         $campos[2] = $1 .  '.' . $campos[2];
    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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.
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

Sintaxis

Notapor STM » 2008-07-07 04:26 @226

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: Seleccionar todo
syntax error at techfile.pl line 45, near "+)"
Execution of techfile.pl aborted due to compilation errors.


Anexo el código de mi programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Muchas Gracias de antemano por la ayuda prestada.

Hasta Luego
STM
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2008-07-01 07:12 @342

Notapor explorer » 2008-07-07 04:38 @235

1.
Donde dice:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($column[0] = ~/(.+)\./) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

debe decir
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($column[0] =~ /(.+)\./) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

3.
La línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    if (\d+)/ ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    next if /\d+/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.
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

Notapor STM » 2008-07-07 07:20 @347

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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 if ($ip4 = m/(.).\ /g) {
   
    $i3=$1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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
STM
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2008-07-01 07:12 @342

Notapor explorer » 2008-07-07 07:58 @373

Hay que cambiar la expresión regular para capturar esos casos (y los anteriores)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sale:
Código: Seleccionar todo
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 (\.).
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

Siguiente

Volver a Básico

¿Quién está conectado?

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