• Publicidad

Problemas imprimir orden de archivo script Perl

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

Problemas imprimir orden de archivo script Perl

Notapor AUAtom4 » 2010-08-12 05:11 @257

Hola a todos, estoy intentando modificar un archivo de Fortran e imprimirlo en el orden que yo quiera.

El archivo es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
simul_type : 1=Gibbs NVT, 2=NPT
 Molecular Weight
 Temperature
 step_init and step_final
 filename containing input data ? (Aopti.res...) (liquid before vapour)
 number of optimised force centres
  number of iterations =       85450
 centre de force :   1  Drho/Deps =  0.81097D+00
 centre de force :   1  Drho/Dsig = -0.24736D+03
 centre de force :   1  Drho/Ddelta = -0.13209D+03
 centre de force :   1  DdeltaH/Deps =  0.76866D+02
 centre de force :   1  DdeltaH/Dsig = -0.19117D+05
 centre de force :   1  DdeltaH/Ddelta = -0.10594D+05
 centre de force :   1  Dln(Psat)/Deps = -0.11212D-01
 centre de force :   1  Dln(Psat)/Dsig =  0.15036D+01
 centre de force :   1  Dln(Psat)/Ddelta =  0.11080D+01
 Drho/DalphaCharge =  0.00000D+00
 DdeltaH/DalphaCharge =  0.00000D+00
 Dln(Psat)/DalphaCharge =  0.00000D+00
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La forma como debería quedar es la siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-0.11212D-01 !Dln(Psat)/Deps-Ethyl375K
0.15036D+01 !Dln(Psat)/Dsig-Ethyl375K
0.11080D+01 !Dln(Psat)/Ddelta-Ethyl375K
0.076866 !DdeltaH/Deps-Ethyl375K
-19.117 !DdeltaH/Dsig-Ethyl375K
-10.594 !DdeltaH/Ddelta-Ethyl375K
0.81097D+00 !Drho/Deps-Ethyl375K
-0.24736D+03 !Drho/Dsig-Ethyl375K
-0.13209D+03 !Drho/Ddelta-Ethyl375K
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sin embargo mi script (que no es muy eficiente que digamos) me hace lo siguiente, es decir lo imprime en este orden:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0.81097D+00 !Drho/Deps-Ethyl375K
-0.24736D+03 !Drho/Dsig-Ethyl375K
-0.13209D+03 !Drho/Ddelta-Ethyl375K
0.076866 !DdeltaH/Deps-Ethyl375K
-19.117 !DdeltaH/Dsig-Ethyl375K
-10.594 !DdeltaH/Ddelta-Ethyl375K
-0.11212D-01 !Dln(Psat)/Deps-Ethyl375K
0.15036D+01 !Dln(Psat)/Dsig-Ethyl375K
0.11080D+01 !Dln(Psat)/Ddelta-Ethyl375K
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


He intentado de varias formas pero no lo he logrado por eso decidí ingresarlo al foro. Mi código es el siguiente, ¿ alguna idea ?

Muchas gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Switch;
  2.  
  3. open(FILE,"deriv_pot_fin.dat") or die("Impossible to open the file");
  4. open(OUT,">deriv_pot_fin.out") or die("Impossible to open the file");
  5. $cont=0;
  6.  
  7. while($line=<FILE>){
  8.     $line=~s/ //g;
  9.     $line=~s/^D//;
  10.     $line =~s/^centredeforce:1//;
  11.     #@lin=<FILE>;
  12.     if($line=~/^Dln/){    
  13.         ($cadena, $numero)= split /=/, $line, 2;
  14.         chomp($numero);
  15.         print OUT  "$numero !$cadena-Ethyl375K\n";    
  16.     }
  17.    
  18.     if($line=~/^Dr/){    
  19.         ($cadena, $numero)= split /=/, $line, 2;
  20.         chomp($numero);
  21.         print OUT "$numero !$cadena-Ethyl375K\n";    
  22.     }
  23.    
  24.     if($line=~/^DdeltaH/){    
  25.         ($cadena, $numero)= split /=/, $line, 2;
  26.         $numero=~s/D/E/;
  27.         $numero/=1000;
  28.         chomp($numero);
  29.         print OUT "$numero !$cadena-Ethyl375K \n";  
  30.     }
  31.    
  32.     $cont ++;
  33.  
  34. }
  35.  
  36. close(FILE);
  37. close(OUT);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
AUAtom4
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-08-12 04:33 @231

Publicidad

Re: Problemas imprimir orden de archivo script Perl

Notapor explorer » 2010-08-12 05:38 @276

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

Primero: no uses el módulo Switch. Se sabe que tiene errores. Lo más probable es que nunca sean corregidos, ya que existe una alternativa nativa desde Perl v5.10, con given/when.

Segundo. Por lo que veo en las salidas, consiste en cambiar el orden de la información que traen las líneas. La solución es que no imprimas las líneas a medida de que las vayas leyendo del fichero (que ese es el orden en que las estás pintando ahora), sino que las vas almacenando en memoria (por ejemplo en varios arrays, uno por cada sección de información). Y una vez terminado de leer y procesar el fichero, recorres los arrays y los imprimes según el orden en que quieres que salga la información.

Prueba, y si te atascas, pues déjanos otro mensaje.
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

Re: Problemas imprimir orden de archivo script Perl

Notapor AUAtom4 » 2010-08-24 03:30 @187

Gracias por responder explorer. En efecto, ya había intentado guardar las variables en un arreglo y al final imprimirlo, para lo cual cambiaba la variable $cadena a @cadena y lo mismo con la de número, y al final del programa le daba por ejemplo, un print(@cadena), pero lo que resulta es que solo está guardando la última línea en cada if().

Gracias de todas formas por la colaboración.
AUAtom4
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-08-12 04:33 @231

Re: Problemas imprimir orden de archivo script Perl

Notapor explorer » 2010-08-24 04:50 @243

No es tan complicado...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3.  
  4. ### Almacenes
  5. my @Drho;
  6. my @DdeltaH;
  7. my @Dln;
  8.  
  9. ### Leemos fichero de entrada
  10. open(FILE,"<deriv_pot_fin.dat") or die("Impossible to open the file\n");
  11.  
  12. while (my $line = <FILE>) {
  13.  
  14.     next if not $line =~ m/centre de force/;
  15.  
  16.     chomp $line;
  17.  
  18.     my ($tag, $value) = $line =~ m/(\S+) \s+ = \s+ (\S+)/x;
  19.  
  20.     given($tag) {
  21.         when(/Drho/) {
  22.             push @Drho,    [ $tag, $value ];
  23.         }
  24.         when(/DdeltaH/) {
  25.             $value =~ s/D/E/;
  26.             $value /= 1_000;
  27.             push @DdeltaH, [ $tag, $value ];
  28.         }
  29.         when(/Dln/) {
  30.             push @Dln,     [ $tag, $value ];
  31.         }
  32.     }
  33. }
  34.  
  35. close FILE;
  36.  
  37. ### Abrimos fichero de salida
  38. open(OUT, ">deriv_pot_fin.out") or die("Impossible to open the file\n");
  39.  
  40. for my $item (@Dln) {
  41.     say OUT $item->[1], ' !', $item->[0], '-Ethyl375K';
  42. }
  43. for my $item (@DdeltaH) {
  44.     say OUT $item->[1], ' !', $item->[0], '-Ethyl375K';
  45. }
  46. for my $item (@Drho) {
  47.     say OUT $item->[1], ' !', $item->[0], '-Ethyl375K';
  48. }
  49.  
  50. close OUT;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

que incluso puede quedar en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. ### Almacen
  6. ## Es un hash, cuyas claves son las distintas etiquetas,
  7. ## y los valores son arrays con las distintas líneas:
  8. ##
  9. ##  $lineas{Drho}[0] = [ 'Drho/Deps', '0.81097D+00' ];
  10. ##
  11. my %lineas;
  12.  
  13. ### Leemos fichero de entrada
  14. open(FILE,"<deriv_pot_fin.dat") or die("Impossible to open the file\n");
  15.  
  16. while (my $line = <FILE>) {
  17.  
  18.     next if not $line =~ /centre de force/;
  19.  
  20.     chomp $line;
  21.  
  22.     my ($tag, $value) = $line =~ /(\S+) \s+ = \s+ (\S+)/x;
  23.  
  24.     if ($tag =~ m/(Drho|DdeltaH|Dln)/) {
  25.         my $clave = $1;
  26.  
  27.         if ($clave eq 'DdeltaH') {      # caso especial
  28.             $value =~ s/D/E/;
  29.             $value /= 1_000;
  30.         }
  31.  
  32.         push @{$lineas{$clave}}, [ $tag, $value ];
  33.     }
  34. }
  35.  
  36. close FILE;
  37.  
  38. ### Abrimos fichero de salida
  39. open(OUT, ">deriv_pot_fin.out") or die("Impossible to open the file\n");
  40.  
  41. for my $clave (qw(Dln DdeltaH Drho)) {
  42.     for my $item (@{$lineas{$clave}}) {
  43.         print OUT $item->[1], ' !', $item->[0], '-Ethyl375K', "\n";
  44.     }
  45. }
  46.  
  47. close OUT;
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


Volver a Básico

¿Quién está conectado?

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