Esta es mi versión:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Modern::Perl; # somos modernos
use utf8; # este programa está escrito en utf8
#use autodie; # es mejor morir que regresar con deshonor (proverbio Klingon)
my $cadena = " \n juana lopes 3459087 24 años \n soltero \n \n";
my ($nombre, $id, $edad, $estado)
= $cadena =~ m/\s+ ([\w\s]+?) \s+ (\d+) \s+ (\d+) \s+ años \s+ (\w+)/x;
say "[$nombre, $id, $edad, $estado]";
__END__
[juana lopes, 3459087, 24, soltero]
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La expresión regular tiene activada la opción /x para escribirla con espacios y que sea más fácil de leer.
Los paréntesis de captura, guardan cada captura y la envían a las variables que declaramos con el my().
"\s+" se "come" todos los espacios en blanco. Eso incluye a "\n", "\r" y "\t". Mientras, "\w" busca por caracteres alfanuméricos, y "\d" por caracteres numéricos.
Un valor fundamental es el de la palabra "años", que la exp. reg. usará para hacer coincidir el resto de los campos.
La exp. regular no está optimizada, por lo que no valdría para procesar grandes volúmenes de información (llevaría mucho tiempo). Haría falta un poco más de información de la entrada. Por ejemplo, si supiéramos que los campos interesantes comienzan todos ellos siempre en las mismas columnas.