$SIG{QUIT} = "quit_catcher";     # implies "main::quit_catcher"

$SIG{QUIT} = *quit_catcher;      # forces current package's sub

$SIG{QUIT} = \&quit_catcher;     # forces current package's sub

$SIG{QUIT} = sub { print "Caught SIGQUIT\n" }   # anonymous sub

*****

local *somesym = *main::variable;

local *somesym = $main::{"variable"};

*****

foreach $symname (sort keys %main::) {

    local *sym = $main::{$symname};

    print "\$$symname is defined\n" if defined $sym;

    print "\@$symname is defined\n" if defined @sym;

    print "\%$symname is defined\n" if defined %sym;

}

*****

*dick = *richard;

*****

*dick = \$richard;

*****

%some_hash = ();

*some_hash = fn( \%another_hash );

sub fn {

    local *hashsym = shift;

    # now use %hashsym normally, and you

    # will affect the caller's %another_hash

    my %nhash = (); # populate this hash at will

    return \%nhash;

}

*****

*PI = \3.14159265358979;

*****

*pkg::sym{SCALAR}      # same as \$pkg::sym

*pkg::sym{ARRAY}       # same as \@pkg::sym

*pkg::sym{HASH}        # same as \%pkg::sym

*pkg::sym{CODE}        # same as \&pkg::sym

*pkg::sym{GLOB}        # same as \*pkg::sym

*pkg::sym{FILEHANDLE}  # internal filehandle, no direct equivalent

*pkg::sym{NAME}        # "sym" (not a reference)

*pkg::sym{PACKAGE}     # "pkg" (not a reference)

*****

        die "green\n";

END   { print "blue\n" }

BEGIN { print "red\n" }

*****

system "rm -rf '$dir'"

*****

sub AUTOLOAD {

    my $program = $AUTOLOAD;

    $program =~ s/.*:://;  # trim package name

    system($program, @_);

} 

date();

who('am', i');

ls('-l');

*****

use subs qw(date who ls);

date;

who "am", "i";

ls "-l";

*****

package      Fred;

require      Exporter;

@ISA       = qw(Exporter);

@EXPORT    = qw(func1 func2);

@EXPORT_OK = qw($sally @listabob %harry func3);

*****

use Module;

*****

use Module LIST;

*****

BEGIN {

    require "Module.pm";

    Module->import();

}

*****

BEGIN {

    require "Module.pm";

    Module->import(LIST);

}

*****

use Module ();

*****

BEGIN { require "Module.pm"; }

*****

require Module;

*****

require Cwd;    # make Cwd:: accessible with qualification

$here = Cwd::getcwd();



use Cwd;        # import names from Cwd:: -- no qualification necessary

$here = getcwd();

*****

use POSIX;

*****

use RedefineTheWorld;

*****

use subs qw(chdir chroot chmod chown);

chdir $somewhere;

sub chdir { ... }

*****

use Module 'open';

*****

use Module;

*****

package Critter;

sub new { return bless {}; }

*****

sub new {

    my     $obref = {};         # ref to empty hash

    bless  $obref;              # make it an object in this class

    return $obref;              # return it

}

*****

$circle->draw();

*****

sub new {

    my $self = {}

    bless $self;

    $self->_initialize();

    return $self;

}

*****

sub new {

    my $class = shift;

    my $self = {};

    bless $self, $class;        # bless $self into the designated class

    $self->_initialize();       # in case there's more work to do

    return $self;

}

*****

$a = {};            # generate reference to hash

$b = $a;            # reference assignment (shallow)

bless $b, Mountain;

bless $a, Fourteener;

print "\$b is a ", ref($b), "\n";

*****

sub find {

    my ($class, $nickname) = @_;

    return $objtable{$nickname};

}

*****

sub display {

    my $self = shift;

    my @keys;

    if (@_ == 0) {                  # no further arguments

        @keys = sort keys(%$self);

    }  else {

        @keys = @_;                 # use the ones given

    }

    foreach $key (@keys) {

        print "\t$key => $self->{$key}\n";

    }

}

*****

$ob1  = StarKnight->new();

$luke = $ob1->new();

*****

package StarKnight;

sub new {

    my $self  = shift;

    my $type  = ref($self) || $self;

    return bless {}, $type;

} 

*****

METHOD CLASS_OR_INSTANCE LIST

*****

$fred = find Critter "Fred";

display $fred 'Height', 'Weight';

*****

display { find Critter "Fred" } 'Height', 'Weight';

*****

CLASS_OR_INSTANCE->METHOD(LIST)

*****

$fred = Critter->find("Fred");

$fred->display('Height', 'Weight');

*****

Critter->find("Fred")->display('Height', 'Weight');

*****

new Critter ('Barney', 1.5, 70);

*****

new Critter ('Bam' x 2), 1.4, 45;

*****

Critter->new('Bam' x 2), 1.4, 45;

*****

$fred = MyCritter::find("Critter", "Fred");

MyCritter::display($fred, 'Height', 'Weight');

*****

$fred = Critter->MyCritter::find("Fred");

$fred->MyCritter::display('Height', 'Weight');

*****

$self->SUPER::display('Height', 'Weight');

*****

$method = $fast ? "findfirst" : "findbest";

$fred->$method(@args);

*****

A: method $obref->{fieldname}

B: (method $obref)->{fieldname}



C: $obref->{fieldname}->method()

D: method {$obref->{fieldname}}

*****

$object = tie VARIABLE, CLASSNAME, LIST



untie VARIABLE



$object = tied VARIABLE

*****

package Some_Class;

sub some_method {

    my $self = shift;

    unless (ref($self) eq "Some_Class") {          # WRONG

        croak "I'm not a Some_Class anymore!";

    }

    unless (ref $self) {                           # better

        croak "bad method call";

    }

}

*****

