Jue Abr 03, 2008 11:24 pm
|
 |
jnunezf
Perlero Nuevo

|
Registrado: 03 Abr 2008
Mensajes: 2
|
|
| Modificar archivos dependiendo de lo que contenga |
|
|
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)
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. |
|
|
|

Vie Abr 04, 2008 5:53 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
|
|
|
|
|
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? ... |
|

Vie Abr 04, 2008 9:43 am
|
 |
jnunezf
Perlero Nuevo

|
Registrado: 03 Abr 2008
Mensajes: 2
|
|
|
|
|
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.
Gracias |
|

Sab Abr 05, 2008 5:17 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
|
|
|
|
|
Aquí tienes dos soluciones:
| 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__ |
|
|
Powered by phpBB © 2001, 2005 phpBB Group
|