Qué tal,
Pues la respuesta practicamente ya te la dió explorer, solo vengo a aclarar algunos puntos importantes.
"static" como lo mencionas, tiene a su vez dos contextos: para variables, y para funciones. Para funciones basta decir que simplemente inhibe el uso de funciones fuera del marco del archivo actual (.c). Para variables tiene dos diferentes usos: Si una variable global es declarada utilizando el calificador static, de la misma manera el símbolo no podrá ser accedido desde otro lugar que no sea dentro del mismo archivo fuente, por otro lado, si una variable local (a una función o bloque) es declarada static, dicha variable mantendrá su estado con las llamadas subsecuentes de la función.
En Perl, la manera más sencilla de lograr dicho comportamiento (y claro, que con muchas ventajas más), es utilizando un "closure". Gracias a que Perl tiene como característica el uso de variables léxicas, estás son creadas en tiempo de compilación con cualidades especiales (REFCNT) que hace que se comporten de manera específica ante ciertos casos, como lo es con un closure (que son llamados "lexical closures", por cierto). Un closure no es mas que una función qué tiene adjuntada una o mas variables (o funciones) que mantienen un estado específico, dentro de un ambiente de ejecución y un alcance.
Using perl Syntax Highlighting
{
my $foo = 1;
sub count
{ ++$foo }
}
# o incluso
sub make_count
{
my $foo = 1;
return sub { ++$foo };
}
count
(); # 2
count
(); # 3
my $cnt = make_count
();
$cnt->(); # 2
$cnt->(); # 3
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Ambos ejemplos anteriores usan un closure para generar un pequeño contador que mantiene su estado con cada llamada. Las ventajas son muchas, y son también muchas las cosas que puedes hacer con un closure.
Otra manera, un poco _más_ avanzada de hacer lo que necesitas es utilizando el módulo Lexical::Persistence, que te permite definir contextos en los que una función podrá ser ejecutada, y mantener el estado de ciertas variables. Utiliza internamente "magia" por medio de los módulos Data::LexAlias y PadWalker; módulos que permiten crear un alias (como referencias en C++, en este contexto) mientras que el segundo permite la inspección de valores léxicos (pads) de una función.
Ya tienes dos opciones, y seguramente podría haber alguna otra...
Saludos,