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 Net::Interface. Quedando lo de arriba en algo como:
my %IP = map { ($_ => [ map { Net::Interface::inet_ntoa($_) } # hace entendibles las direcciones $_->address, ] # obtiene las direcciones ); } Net::Interface->interfaces; # obtiene las interfaces
Que devolvería un hash con el nombre de cada interfaz como clave y su IP como valor. Idóneo por ejemplo para invertirlo y usar la IP en el patrón de búsqueda de una expresión regular de sustitución.
Aunque a decir verdad no sé si este módulo del ejemplo funcionará en Windows. 😀
Fuente → How can I find the IP addresses for each interface, in Perl? [Stack Overflow].