Perl en Español

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

Modificar archivos dependiendo de lo que contenga

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Jue Abr 03, 2008 11:24 pm
jnunezf
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Abr 2008
Mensajes: 2
Modificar archivos dependiendo de lo que contenga Responder citando

Hola, soy nuevo en el foro. Tengo un problema a resolver, lo que quiero es agregar al final de un archivo "un texto" que dependa de lo que "contenga cada archivo" del directorio; por ejemplo:

Si el archivo contiene este texto: (comb. lineal con variables)
Código:
7.21*x101 + 5.66*x102;

tenga que agregar al final este texto: (declaración de las variables)
Código:
bin x101, x102;


En cambio, si contiene este texto, (más grande)
Código:
7.21*x101 + 5.66*x102 + 5.83*x103 + 6.32*x104 ;

se tenga que agregar este texto:
Código:
bin x101, x102, x103, x104;


Lo que quiero es que, para cada archivo, encuentre todas las variables x y las declare al final del archivo como 'bin'.

Por favor, confío en ustedes, espero que no sea tan complicado.

Muchas Gracias.
Mensaje Vie Abr 04, 2008 5:53 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
Responder citando

Bienvenido a los foros de Perl en Español, jnunezf.

¿Dónde está el código de prueba? Es que dar la solución, sin más ni más... (además, estamos en el foro Intermedio).

¿Una variable, por ejemplo la x101, puede aparecer más de una vez en el texto? ¿Puede aparecer más de una vez la línea con la ecuación? ¿Debe guardarse en el fichero de salida las variables encontradas en algún determinado orden? ...
Mensaje Vie Abr 04, 2008 9:43 am
jnunezf
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Abr 2008
Mensajes: 2
Responder citando

Hola, gracias por la acotación.
La idea es agregar información al final de un archivo que contiene un modelo de programación lineal.
Una vez que lea función objetivo, por ejemplo:
Código:
min:
   7.21*x101 + 5.66*x102 + 5.83*x103 + 6.32*x104 +
   7.07*x105 + 3.61*x106 + 5*x107 + 7.21*x110;

todas estas variables aparecen una sola vez antes del ";" y necesito declararlas al final como:
Código:
bin x101, x102, x103, x104, x105, x106, x107, x110;

no importa el orden, pero la idea es que aparezcan todas.
Otra cosa importante es que después del ";" en el archivo sigue una lista de restricciones donde se repiten estas variables, como por ejemplo:
Código:
subjecttor11:
   x101 + x102 + x103 = 1;

subjecttor12:
   x201 + x202 + x203 = 1;

Estas líneas no hay que considerarlas. Hay que considerar todo el texto que está antes del primer ";" del archivo.
Aquí les pongo un archivo de ejemplo que tengo:
Código:
min:
   7.21*x101 + 5.66*x102 + 5.83*x103 + 6.32*x104 +
   7.07*x105 + 3.61*x106 + 5*x107 + 7.21*x110 +
   8.25*x112 + 11.05*x113 + 8.25*x114 + 14.21*x115 +
   10.82*x116 + 4.12*x117 + 5.66*x120 + 8.25*x121 +
   11.4*x123 + 11.66*x124 + 9.06*x125 + 7.28*x126 +
   4.12*x127 + 5.83*x130 + 11.05*x131 + 11.4*x132 +
   4.24*x134 + 8*x135 + 5.39*x136 + 10.44*x137 +
   6.32*x140 + 8.25*x141 + 11.66*x142 + 4.24*x143 +
   11.4*x145 + 8.06*x146 + 9.22*x147 + 7.07*x150;


subjecttor11:
   x101 + x102 + x103 = 1;

subjecttor12:
   x201 + x202 + x203 = 1;


subjecttor311:
   x110 + x111 + x112 + x113 + x114 + x115 +
   x116 + x117 - x140 - x141 - x142 - x143 -
   x144 - x145 - x146 - x147 = 0;

Aunque las variables se repiten en el archivo, las tengo que declarar al final sin que se repitan. En la función objetivo no se repiten.
No tengo que crear otro archivo, sólo modificar el original declarando las variables.

Espero que no sea tan complicado. Very Happy
Gracias
Mensaje Vie Abr 04, 2008 11:46 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
Responder citando

A ver si con lo siguiente tienes una pista:

Perl:
perl -p -e 'BEGIN {$in=0} $in=1 if /^min:/; if ($in==1) { while( /(x\d+)/g ) {$vars{$1}++} }  $in=2 if /;/;  END { print "\nbin ",join(", ",sort keys %vars),";\n" }' kk.txt
Mensaje Sab Abr 05, 2008 5:17 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
Responder citando

Aquí tienes dos soluciones:

Perl:
#!/usr/bin/perl
use warnings;
use strict;

my %vars;

my $archivo = shift @ARGV or die;
open F, "<$archivo"       or die;
while ( <F> ) {
    if ( /^min:/ .. /^$/ ) {
        while ( /(x\d+)/g ) {
            $vars{$1} = 1;
        }
    }
    print ;
}
close F;

print "\nbin ";
print join ', ', sort keys %vars;
print ";\n";

__END__

Perl:
#!/usr/bin/perl
use warnings;
use strict;

my $archivo
    = do {
        local $/;
        open F,$ARGV[0];
        <F>;
    };

my ($min) = $archivo =~ /min:(.*?);/simo;

my %hash;
map { $hash{$_}++ } $min =~ /(x\d+)/g;

print "$archivo\nbin ", join(", ",sort keys %hash),";\n";

__END__
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group