notes blog about

#!/usr/bin/perl
# Scope of Perl variables. For more see:
# - Mastering Perl, ch. 7 Symbol Tables and Typeglobs
# - Programming Perl, ch. 2
use v5.14;
use warnings;

our $global = q(I'm the global version);

show_me('at start');
lexical();
localized();
show_me('at end');

sub show_me {
    # show_me() is outside of the lexical scope of any other subroutine
    
    my $tag = shift;

    print "show_me() $tag: \$global --> $global\n";
    print '-' x 79, "\n";
}

sub lexical {
    # "my" defines lexical scope for variables which depends solely on the
    # inspection of the code
    my $global = q(I'm the lexical version);

    {
        our $global;
        print "In the naked block, our \$global --> $global\n";
    }

    print "In lexical(), my \$global --> $global\n";
    print "The package version, \$main::global --> $main::global\n";
    show_me('from lexical()');
}

sub localized {
    # "local" defines dynamic scope which depends on the state of the program
    # during runtime
    local $global = q(I'm the localized version);

    print "In localized(): local \$global --> $global\n";
    print "The package version, \$main::global --> $main::global\n";
    show_me('from localized()');
}