extern: index | reference
intern: package | sample | hexer | __PACKAGE__ | end
The perl 'package' declaration declares the compilation unit as being in the given 'NAMESPACE', as contained in __PACKAGE__. The scope of the package declaration is from the declaration itself through the end of the enclosing block, file, or eval (the same as the my operator). All further unqualified dynamic identifiers will be in this namespace.
You can switch into a package in more than one place; it merely influences which symbol table is used by the compiler for the rest of that block. You can refer to variables and file handles in other packages by prefixing the identifier with the package name and a double colon: $Package::Variable . If the package name is null, the main package as assumed. That is, $::sail is equivalent to $main::sail (as well as to $main'sail , still seen in older code).
Some sample code using 'package' to declare a 'Hexer' namespace, then switch back to 'main' to use this package...
code:
#!/usr/bin/perl -W # NAME: package.pl # AIM: Simple use of 'package' declaration use strict; use warnings; #################################### package Hexer; #################################### sub new { my($class) = @_; my $str = ""; bless \$str, $class; } sub toHex { my ($self,$str) = @_; my $len = length($str); my @a = unpack ("C$len", $str); my $s = ""; for (@a) { $s .= sprintf ("%02x ", $_); } $s; } ###################################### package main; ###################################### my $cc = "ABC \n"; my $a = new Hexer; my $hex = $a->toHex($cc); print "hex $hex\n"; ###################################### # eof - package.pl
output:
hex 41 42 43 20 0a
Note the TEMPLATE used for the 'unpack (TEMPLATE, EXPR)' is "C$len", which is an 'unsigned character (octal) value' array - see pack documentation for the possible TEMPLATES - for the length of the string. And that's it ...
This is a reserved global value, containing the current 'namespace', and then a function, dispSymbols(), to display the 'symbols' defined in a 'package'...
code:
#!/usr/bin/perl use strict; use warnings; my $pack = __PACKAGE__; print "Show defined symbols in package [$pack]\n"; sub dispSymbols { my ($hashRef) = shift; my (%symbols); my (@symbols); %symbols = %{$hashRef}; @symbols = sort(keys(%symbols)); foreach (@symbols) { printf("%-10.10s| %s\n", $_, $symbols{$_}); } } my $sym = '\%'.$pack.'::'; dispSymbols(eval $sym);
output:
Show defined symbols in package [main] | *main:: ↕ | *main::↕ ↕E_TRIE_MA| *main::↕E_TRIE_MAXBUF ↨ARNING_BI| *main::↨ARNING_BITS ↑ | *main::↑ " | *main::" $ | *main::$ / | *main::/ 0 | *main::0 @ | *main::@ ARGV | *main::ARGV ActivePerl| *main::ActivePerl:: BEGIN | *main::BEGIN CORE:: | *main::CORE:: Carp:: | *main::Carp:: DB:: | *main::DB:: DynaLoader| *main::DynaLoader:: ENV | *main::ENV INC | *main::INC ... etc ... etc ... dispSymbol| *main::dispSymbols main:: | *main::main:: mro:: | *main::mro:: re:: | *main::re:: stderr | *main::stderr stdin | *main::stdin stdout | *main::stdout strict:: | *main::strict:: utf8:: | *main::utf8:: version:: | *main::version:: warnings::| *main::warnings::
More on the symbol tables and can be found at - http://affy.blogspot.com/p5be/ch15.htm
Care should be taken when using these 'Special Literals', like __PACKAGE__, __FILE__, __LINE__!, They may be used only as separate tokens; they will not be interpolated into strings. And, if there is no current package (due to an empty package; directive), __PACKAGE__ is the undefined value. Example :-
code:
package Illumination; use strict; use warnings; use Data::Dumper; my %hash; my $pack = __PACKAGE__; my $line = __LINE__; my $file = __FILE__; $hash{$pack}{$file}{$line} = "Mo Mo"; $hash{__PACKAGE__}{__FILE__}{__LINE__} = "Mu Mu"; print Dumper \%hash;
output:
$VAR1 = { 'Illumination' => { 'temp.pl' => { '7' => 'Mo Mo' } }, '__PACKAGE__' => { '__FILE__' => { '__LINE__' => 'Mu Mu' } } };
Two other 'Special Literals' are __END__ and __DATA__
Some interesting examples, showing 'scope' of variables...
code:
#!/usr/bin/perl # not strict clean, yet, but just wait # ie can NOT 'use strict;'! $global = "I'm the global version"; sub show_me { my $tag = shift; print "$tag: $global\n" } sub lexical { my $global = "I'm in the lexical version"; print "In lexical(), \$global is --> $global\n"; show_me('From lexical()'); } sub localized { local $global = "I'm in the localized version"; print "In localized(), \$global is --> $global\n"; show_me('From localized'); } show_me('At start'); lexical(); localized(); show_me('At end');
output:
At start: I'm the global version In lexical(), $global is --> I'm in the lexical version From lexical(): I'm the global version In localized(), $global is --> I'm in the localized version From localized: I'm in the localized version At end: I'm the global version
And there is more... from vartypes.pl to HTML.
code:
#!/usr/bin/perl package Foo; @n = 1 .. 5; $string = "Hello Perl!\n"; %dict = ( 1 => 'one' ); sub add { $_[0] + $_[1] } foreach my $entry ( keys %Foo:: ) { print "-" x 8, " Name: [$entry]\t"; print "scalar is defined\n" if defined ${$entry}; print "array is defined\n" if defined @{$entry}; print "hash is defined\n" if defined %{$entry}; print "sub is defined\n" if defined &{$entry}; }
output:
-------- Name: [n] array is defined -------- Name: [add] sub is defined -------- Name: [string] scalar is defined -------- Name: [dict] hash is defined
And from typeglob-name-package.pl to HTML.
code:
#!/usr/bin/perl package Foo; $foo = "Some value"; $bar = "Another value"; who_am_i( *foo ); who_am_i( *bar ); sub who_am_i { local $glob = shift; print "I'm from package [" . *{$glob}{PACKAGE} . "]\n"; print "My name is [" . *{$glob}{NAME} . "]\n"; }
output:
I'm from package [Foo] My name is [foo] I'm from package [Foo] My name is [bar]
And a tricky typeglob assignment from typeglob-assignment.pl to HTML.
code:
#!/usr/bin/perl $foo = "Foo scalar"; @foo = 1 .. 5; %foo = qw(One 1 Two 2 Three 3); sub foo { "I'm a subroutine!"; } *bar = *foo; # typeglob assignment print "Scalar is <$bar>, array is <@bar>\n"; print 'Sub returns <', bar(), ">\n"; $bar = 'Bar scalar'; @bar = 6 .. 10; print "Scalar is <$foo>, array is <@foo>\n";
output:
Scalar is <Foo scalar>, array is <1 2 3 4 5> Sub returns <I'm a subroutine!> Scalar is <Bar scalar>, array is <6 7 8 9 10>
Zute...
EOF - perl_package.htm