Obtener la IP de cada interfaz en Perl

Obtener la IP de la máquina no tiene mucho misterio. Pero cuando se trata de servidores con varias interfaces de red, algunas incluso virtuales, la cosa cambia. Y se trata de algo que puede tener muchas aplicaciones, como por ejemplo un script que distinga entre si las copias que se van a realizar son realmente desde/hacia una máquina remota o en local y agilizar el proceso.

La manera más resumida en el caso de Linux es filtrar la salida de ifconfig:

my @IP = (`ifconfig -a` =~ /inet addr:(\S+)/g);

Pero es cierto que algún día los desarrolladores de la distribución de turno pudieran decidir traducir las palabras inet addr por direccion inet o a saber, por lo que ya estarían fastidiando la expresión regular y por tanto el invento. Así que por eso para soluciones más elegantes y multiplataforma, que para eso es Perl, se puede hacer uso de algún módulo como […] (continuar leyendo)

Compartir un hash multidimensional entre hilos en Perl

De cara a la concurrencia es frecuente hacer un script que vaya lanzando hilos según sea necesario. Y no mucho menos habitual es también que tales hilos compartan algunas variables. Un ejemplo puede ser un sistema que recibe peticiones y mientras tanto las va lanzando en hilos.

A priori parece la mar de sencillo. Usando threads y threads::shared con un array o un hash se resuelve el asunto. Sin embargo si no hubiera más remedio que utilizar un hash y de más de una dimensión vendría el problema. Con shared se comparte un nivel del hash, de manera que si se tiene compartido %miscosas y se necesita ahora utilizar $miscosas{1339953221}{detalles}{algo} vamos a tener un error de vuelta del estilo invalid value for shared scalar.

Para ello hay dos soluciones posibles […] (continuar leyendo)

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 […] (continuar leyendo)