La explicación está mal desde el principio: local() no
declara variables locales. Es my() quien lo hace. local() solo
asigna valores temporales a variables que ya existen.
Para estar seguros, activa el modo 'strict' y 'warnings' y será el propio Perl el que te avisará si ve alguna cosa rara.
Si lo haces, Perl saca esto:
Using text Syntax Highlighting
explorer@portatil ~/Documentos/Desarrollo $ perl -c code_30744.pl
Global symbol "$c" requires explicit package name at code_30744.pl line 10.
Global symbol "$d" requires explicit package name at code_30744.pl line 11.
Global symbol "$suma2" requires explicit package name at code_30744.pl line 15.
Global symbol "$suma" requires explicit package name at code_30744.pl line 19.
Global symbol "$c" requires explicit package name at code_30744.pl line 19.
Global symbol "$d" requires explicit package name at code_30744.pl line 19.
Global symbol "$suma" requires explicit package name at code_30744.pl line 21.
Global symbol "$c" requires explicit package name at code_30744.pl line 25.
Global symbol "$d" requires explicit package name at code_30744.pl line 25.
code_30744.pl had compilation errors.
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y ya ves algo curioso: te dice que $c, en la línea 10, es una variable
que necesita, obligatoriamente, que esté definida en algún paquete. O lo que es lo mismo: no sabe dónde está definida, y por eso lo marca como error.
Eso es porque local() necesita que $c
ya esté definida en otro lugar, como variable global. No la va a crear, sino que le va a dar un valor temporal (500, en el código), recuperando el valor anterior cuando se termine el contexto en donde está.
Otra cosa es que lo ejecutes sin 'strict'. Entonces, "parece" que funciona, pero es porque Perl, en modo no estricto, autovivifica las variables globales (las crea de la nada) en cuanto son mencionadas.