• Publicidad

Carga condicional de módulo bajo MINGW64/MSYS

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

Carga condicional de módulo bajo MINGW64/MSYS

Notapor pablgonz » 2020-06-11 19:05 @837

Hola a todos, tengo una pregunta respecto a cómo cargar un módulo de forma condicional.

Tengo el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.30;
  3.  
  4. my $Win = 0;
  5. if ($^O =~ /mswin32/i) { $Win = 1; }
  6. if ($^O =~ /cygwin/i) { $Win = 1; }
  7. if ($^O =~ /msys/i) { $Win = 1; }
  8.  
  9. if ($Win) {
  10.         say 'Cargando el módulo Win32::TieRegistry';
  11.         eval 'use Win32::TieRegistry qw|KEY_READ REG_SZ|';
  12.         my $open_params = {Access => KEY_READ(), Delimiter => q{/}};
  13. }
  14. else{
  15.         say 'No cargamos el módulo Win32::TieRegistry';
  16. }
  17.  
  18. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
el cual funciona sin problemas en Windows y Linux pero no puedo hacer que cargue el módulo Win32::TieRegistry cuando llamo al script desde la consola de git en Windows.

La salida en Windows es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. Cargando el m├│dulo Win32::TieRegistry 

La salida en Linux es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. No cargamos el módulo Win32::TieRegistry 

Y la salida usando git bash en Windows es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. Cargando el módulo Win32::TieRegistry 
  2. Undefined subroutine &main::KEY_READ called at forum.pl line 12. 


Asumo que el problema pasa por MINGW64/MSYS y alguna configuración de variable de entorno que confunde a perl cuando carga el módulo. La salida de env es:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. $ env 
  2. USERDOMAIN=WORKTEX 
  3. OS=Windows_NT 
  4. COMMONPROGRAMFILES=C:\Program Files\Common Files 
  5. PROCESSOR_LEVEL=6 
  6. PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules 
  7. CommonProgramW6432=C:\Program Files\Common Files 
  8. CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files 
  9. LANG=es_MX.UTF-8 
  10. MSYSTEM_CARCH=x86_64 
  11. DISPLAY=needs-to-be-defined 
  12. HOSTNAME=worktex 
  13. PUBLIC=C:\Users\Public 
  14. CONFIG_SITE=/mingw64/etc/config.site 
  15. EXEPATH=C:\Program Files\Git 
  16. MSYSTEM_CHOST=x86_64-w64-mingw32 
  17. USERNAME=pablo 
  18. ChocolateyInstall=C:\ProgramData\chocolatey 
  19. JAVA_HOME=D:\jdk 
  20. LOGONSERVER=\\WORKTEX 
  21. PROCESSOR_ARCHITECTURE=AMD64 
  22. LOCALAPPDATA=C:\Users\pablo\AppData\Local 
  23. COMPUTERNAME=WORKTEX 
  24. !::=::\ 
  25. SYSTEMDRIVE=C: 
  26. USERPROFILE=C:\Users\pablo 
  27. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC 
  28. SYSTEMROOT=C:\Windows 
  29. USERDOMAIN_ROAMINGPROFILE=WORKTEX 
  30. PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel 
  31. MINGW_PACKAGE_PREFIX=mingw-w64-x86_64 
  32. PWD=/d/linux/ltximg/test 
  33. SSH_ASKPASS=/mingw64/libexec/git-core/git-gui--askpass 
  34. HOME=/c/Users/pablo 
  35. TMP=/tmp 
  36. TERM_PROGRAM=mintty 
  37. TERM_PROGRAM_VERSION=3.1.6 
  38. MSYSTEM_PREFIX=/mingw64 
  39. OneDrive=C:\Users\pablo\OneDrive 
  40. PROCESSOR_REVISION=2a07 
  41. TMPDIR=/tmp 
  42. NUMBER_OF_PROCESSORS=2 
  43. ProgramW6432=C:\Program Files 
  44. COMSPEC=C:\Windows\system32\cmd.exe 
  45. APPDATA=C:\Users\pablo\AppData\Roaming 
  46. SHELL=/usr/bin/bash 
  47. TERM=xterm 
  48. WINDIR=C:\Windows 
  49. MINGW_CHOST=x86_64-w64-mingw32 
  50. ProgramData=C:\ProgramData 
  51. SHLVL=1 
  52. PLINK_PROTOCOL=ssh 
  53. ACLOCAL_PATH=/mingw64/share/aclocal:/usr/share/aclocal 
  54. PROGRAMFILES=C:\Program Files 
  55. MANPATH=/mingw64/local/man:/mingw64/share/man:/usr/local/man:/usr/share/man:/usr/man:/share/man 
  56. ORIGINAL_TEMP=/tmp 
  57. ORIGINAL_TMP=/tmp 
  58. ALLUSERSPROFILE=C:\ProgramData 
  59. TEMP=/tmp 
  60. DriverData=C:\Windows\System32\Drivers\DriverData 
  61. MSYSTEM=MINGW64 
  62. MINGW_PREFIX=/mingw64 
  63. asl.log=Destination=file 
  64. SESSIONNAME=Console 
  65. ProgramFiles(x86)=C:\Program Files (x86) 
  66. PATH=/c/Users/pablo/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/pablo/bin:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/Windows/System32/OpenSSH:/cmd:/c/ProgramData/chocolatey/bin:/c/Strawberry/c/bin:/c/Strawberry/perl/site/bin:/c/Strawberry/perl/bin:/c/Users/pablo/AppData/Local/Microsoft/WindowsApps:/c/texlive/2020/bin/win32:/d/jdk/bin:/usr/bin/vendor_perl:/usr/bin/core_perl 
  67. PS1=\[\033]0;$TITLEPREFIX:$PWD\007\]\n\[\033[32m\]\u@\h \[\033[35m\]$MSYSTEM \[\033[33m\]\w\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ 
  68. HOMEDRIVE=C: 
  69. ChocolateyLastPathUpdate=132361075449381174 
  70. PKG_CONFIG_PATH=/mingw64/lib/pkgconfig:/mingw64/share/pkgconfig 
  71. INFOPATH=/usr/local/info:/usr/share/info:/usr/info:/share/info 
  72. HOMEPATH=\Users\pablo 
  73. ORIGINAL_PATH=/mingw64/bin:/usr/bin:/c/Users/pablo/bin:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/Windows/System32/OpenSSH:/cmd:/c/ProgramData/chocolatey/bin:/c/Strawberry/c/bin:/c/Strawberry/perl/site/bin:/c/Strawberry/perl/bin:/c/Users/pablo/AppData/Local/Microsoft/WindowsApps:/c/texlive/2020/bin/win32:/d/jdk/bin 
  74. _=/usr/bin/env 


¿Cuál es la manera correcta de cargar el módulo bajo MINGW64/MSYS?
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Carga condicional de módulo bajo MINGW64/MSYS

Notapor explorer » 2020-06-11 20:00 @875

¿Qué es la "consola de git"?
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: Carga condicional de módulo bajo MINGW64/MSYS

Notapor pablgonz » 2020-06-11 20:10 @882

Hola, al instalar git en windows (https://git-scm.com/download/win), este trae consigo un terminal (mintty) que proporciona un pseudo bash con la mayoría de las utilidades que windows no posee y que si tenemos en linux (ls, cat, grep, etc) usando MINGW/MSYS.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Carga condicional de módulo bajo MINGW64/MSYS

Notapor explorer » 2020-06-11 20:18 @888

En vez de eval() yo usaría require().

También se podría intentar con el módulo if.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use if $^O eq 'MSWin32', 'Win32::Process::List';
Coloreado en 0.001 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

Re: Carga condicional de módulo bajo MINGW64/MSYS

Notapor pablgonz » 2020-06-11 20:24 @891

Había intentado usar if, pero el mensaje de salida era el mismo (aunque quizás no lo escribí de la manera correcta). Al cambiar a require la salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. Can't locate use Win32::TieRegistry qw|KEY_READ REG_SZ| in @INC (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl) at forum.pl line 11. 
De ahí mi sospecha que algo está errado en las variables que define.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Carga condicional de módulo bajo MINGW64/MSYS

Notapor explorer » 2020-06-11 20:33 @898

No, no, no... así no se resuelven las cosas... debes publicar el código que vas cambiando.

Por el mensaje de error, veo que has puesto require(), pero no has quitado el use().
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: Carga condicional de módulo bajo MINGW64/MSYS

Notapor explorer » 2020-06-11 20:43 @905

Aquí hay un ejemplo de carga condicional de módulos según el sistema operativo.

Lo que creo que puede estar pasando es que al ejecutar el programa en esa consola de comandos, el Windows "desaparezca" y por eso no funcionen los módulos Win32. No creo que sea así, pero es una posibilidad.
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: Carga condicional de módulo bajo MINGW64/MSYS

Notapor pablgonz » 2020-06-11 20:45 @906

Mil disculpas, debo quedarme con eval(). De otra manera obtengo errores. El código está así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.30;
  3. use Config;
  4.  
  5. my $archname = $Config{'archname'};
  6. say $archname;
  7.  
  8. my $Win = 0;
  9. if ($^O =~ /mswin32/i) { $Win = 1; }
  10. if ($^O =~ /cygwin/i) { $Win = 1; }
  11. if ($^O =~ /msys/i) { $Win = 1; }
  12.  
  13. if ($Win) {
  14.         say 'Cargando el módulo Win32::TieRegistry';
  15.         eval 'use Win32::TieRegistry qw|KEY_READ REG_SZ|';
  16.         my $open_params = {Access => KEY_READ(), Delimiter => q{/}};
  17. }
  18. else{
  19.         say 'No cargamos el módulo Win32::TieRegistry';
  20. }
  21.  
  22. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y la salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. $ perl forum.pl 
  2. x86_64-msys-thread-multi 
  3. Cargando el módulo Win32::TieRegistry 
  4. Undefined subroutine &main::KEY_READ called at forum.pl line 16. 

Pero si lo uso desde la consola de Windows, la salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. perl forum.pl 
  2. MSWin32-x64-multi-thread 
  3. Cargando el m├│dulo Win32::TieRegistry 
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Carga condicional de módulo bajo MINGW64/MSYS

Notapor pablgonz » 2020-06-11 23:05 @003

Creo que he pillado qué es lo que sucede.

Como estaba usando Escritorio Remoto para acceder al ordenador con Windows no me percaté (y jamás me lo pregunté) que git para Windows trae un Perl "capado", por decirlo de alguna manera. Como es la misma versión del Perl que estaba instalada en ese ordenador no lograba ver que estaba errado, pero al usar $archname = $Config{'archname'}; y ver que las salidas eran distintas, recordé que esa variable muestra la arquitectura en la cual fue compilada la versión de perl y no era posible que obtuviera dos salidas distintas.

Al arrancar esa consola, reordena las variables de entorno y coloca la versión de perl que trae incluida antes de la versión que tengo instalada en Windows. En este punto creo que he quedado entrampado, no puedo agrega módulos a la versión "capada" de Perl que trae git para Windows (o me falta seguir navegando un rato).

Asumo que una vez que arranca el script, ya no puedo cambiar la ruta desde la cual lee los módulos :( ¿Existe alguna forma de salir del paso?

Y una consulta relacionada. En el enlace que me has dado usan un código del tipo:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. eval { require Módulo; } 

¿Es necesario usar { ... } al escribir eval?
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Carga condicional de módulo bajo MINGW64/MSYS

Notapor explorer » 2020-06-12 07:13 @342

No es lo mismo $Config{'archname'} que $^O.

Puedes incluir directorios de búsqueda de paquetes (o sea, modificar el contenido de @INC) por medio de

use lib 'ruta';

El eval() tiene dos formas de funcionar. Si se le pasa una cadena (con comillas) la expresión que hay dentro se evalúa y se ejecuta cada vez que el procesador pase por esa línea.

En cambio, si a eval le pasamos un bloque (con las llaves), el contenido es interpretado una sola vez (al mismo tiempo que la línea que lo contiene es interpretada), y luego ejecutada cuando el procesador llegue allí.

La ventaja de esta segunda solución es clara: se detectan errores sintácticos en tiempo de compilación, y solo se interpreta una vez, con lo que es más rápida que la primera solución.

Más información en perldoc -f eval
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 12 invitados

cron