#!/usr/bin/perl -w use strict; #recordemos que estamos en el paquete main use vars qw($foo); $foo = "Yo!"; # damos valor a $main::foo print "\$foo: $foo\n"; # muestra "Yo!" my $foo = "Hey!"; # variable my a nivel de archivo print "\$foo: $foo\n"; # muestra "Hey!" -- la variable nueva 'pisa' a la vieja { # comenzamos un bloque my $foo = "Yacht-Z"; print "\$foo: $foo\n"; # muestra "Yacht-Z" -- hay una nueva variable $foo visible print "\$main::foo: $main::foo\n"; # todavía podemos ver $main::foo subroutine(); } # fin del bloque print "\$foo: $foo\n"; # nuestra variable $foo a nivel de archivo se ve otra vez! print "\$main::foo: $main::foo\n"; # $main::foo todavía está aquí sub subroutine { print "\$foo: $foo\n"; # muestra "Hey!" # ¿Por qué? porque la variable declarada en el bloque sin nombre está en # su ámbito -- ahora tenemos otras llaves distintas rodeando esto. Pero la # variable de archivo todavía está en ámbito, y todavía "pisa" a la # declaración de $main::foo. } package Bar; print "\$foo: $foo\n"; # muestra "Hey!" -- la variable my todavía es visible # si no hubiéramos hecho la declaración arriba, esto provocaría un error: el # intérprete nos diría que Bar::foo no ha sido definida. __OUTPUT__ $foo: Yo! $foo: Hey! $foo: Yacht-Z $main::foo: Yo! $foo: Hey! $foo: Hey! $main::foo: Yo! $foo: Hey!