#!/usr/bin/perl -w package Szywiecki; $Robert = "el jefe"; sub terminate { my $name = shift; print "$Robert ha despedido a ${name}\n"; } terminate("arturo"); # muestra "el jefe ha despedido a arturo" package main; # terminate("arturo"); # produce un error si se descomenta __OUTPUT__ el jefe ha despedido a arturo #### #!/usr/bin/perl -w use strict; $Robert = "el jefe"; # error! print "\$Robert = $Robert\n"; #### #!/usr/bin/perl -w use strict; $main::Robert = "el jefe"; print "\$main::Robert = $main::Robert\n"; #### #!/usr/bin/perl -w package Szywiecki; $Robert = "el jefe"; package PoolHall; $Robert = "el experto en dardos"; package Szywiecki; # a trabajar otra vez! print "Aquí en el trabajo, 'Robert' es $Robert, pero en la piscina, 'Robert' es $PoolHall::Robert\n"; __OUTPUT__ Aquí en el trabajo, 'Robert' es el jefe, pero en la piscina, 'Robert' es el experto en dardos #### #!/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! #### #!/usr/bin/perl -w use strict; our ($bob); use vars qw($carol); $carol = "ted"; $bob = "alice"; print "Bob => $bob, Carol => $carol\n"; package Movie; print "Bob => $bob, Carol => $carol\n"; #### #!/usr/bin/perl -w use strict; use vars qw ($foo); # "our $foo" si usamos 5.6 $foo = "global value"; print "\$foo: $foo\n"; # muestra "global value" print "mysub result '", &mysub(), "'\n"; # "global value" print "localsub result '", &localsub(), "'\n"; # "local value" print "no sub result '", &showfoo(), "'\n"; # "global value" sub mysub { my $foo = "my value"; showfoo(); } sub localsub { local $foo = "local value"; showfoo(); # SIEMPRE muestra "local value" } sub showfoo { return $foo; } __OUTPUT__ $foo: global value mysub result 'global value' localsub result 'local value' no sub result 'global value'