Módulos en Perl multiplataforma

El lenguaje Perl permite escribir scripts multiplataforma sin demasiados problemas. Aunque siempre puede haber algunos impedimentos como por ejemplo la carga de módulos que no están disponibles para todos los sistemas operativos. Aquí va un ejemplo con Linux y Windows.

Puede darse el caso de necesitar un script que pueda correr como demonio en Linux o servicio de sistema en Windows. Para el segundo entorno el asunto se complica dado que se necesita de un módulo como Win32::Daemon, el cual si intentamos endosarle a Linux nos dirá que tararí. Y es que, aunque pudiera parecer suficiente con algo así:

if($^O ne 'linux'){
  #Estoy en Windows
  use Win32::Daemon;
  #...
}

El script fallará cuando se ejecute en Linux porque no encuentre el módulo Win32::Daemon. A pesar de que sólo deba cargarlo en el caso de no estar funcionando en Linux. Pero gracias a eval y require algo se puede arreglar:

if($^O ne 'linux'){
  #Estoy en Windows
  eval{require Win32::Daemon;};
  #...
}

De esta manera Linux pasará por el aro y Windows hará lo que esté indicado. Sin embargo puede darse el caso de módulos que necesiten recibir un hash en el momento de su carga, como el caso de Win32::Daemon::Simple —versión simplificada de Win32::Daemon—, y para los que habrá que hacer la carga desde otro script que será requerido desde el principal:

#servicio.pl
use Win32::Daemon::Simple
  Service => 'follonero',
  Name => 'servicio follonero',
  #...
  ;
#script principal
if($^O ne 'linux'){
  #Estoy en Windows
  require 'servicio.pl';
  #...
}

De esta forma Linux no se pasará de listo inspeccionando y Windows hará lo que se espera de él.

Esto de la portabilidad entre scripts tiene su atractivo. En el caso de servicios el lidiar con la carga de módulos es sólo la punta del iceberg, seguida por el manejo de archivos, directorios, detección de señales, etc. 🙂

Inspiración → How can I detect the operating system in Perl? @ Stack Overflow.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *