#!/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'