Understand typeglobs
The typeglob represents an entry in the symbol table.
# * Main::num $main::{num} has almost the same meaning.
# * num You can omit the package name.
On the symbol table, $main::{num} is assigned the string'* main::num', which is exactly what it is (called the symbol table entry, maybe). .. However, it's not a string, it's a typeglob.
If you omit the package name, it becomes an entry in the symbol table of the current current package.
Typeglobs and variable
my $num_from_typedglob = ${* main::num}; # Same as $num
my @num_from_typedglob = @{* main::num}; # Same as @num
my %num_from_typedglob = %{* main::num}; # Same as%num
my $ret_from_typedglob = & {* main::num}; # Same as & num (also same as num ())
A typeglob is a kind of hash, a scalar variable, array, < You can access a href="/blog/20161013147635.html">hash, subroutine, and more. It looks exactly like a dereference, but it's not a dereference.
Image of type glob
| - -- -- -- -- |
| * typedglob |-|
| - -- -- -- --- | |
| | - -- -- -- -- --- |
| - -- > | ${* typedglob} |
| | - -- -- -- -- --- |
| - -- > | @{* typedglob} |
| | - -- -- -- -- --- |
| - -- > |%{* typedglob} |
| | - -- -- -- -- --- |
| - -- > | & {* typedglob} |
| - -- -- -- -- --- |
Example
A example to understand typeglobs and symbol tables.
use strict;
use warnings;
# Type glob
# * typedglob;
# Represents an entry in the symbol table.
# Variable with the same name but different only in funny characters ($, @,%)
our $num = 11;
our @num = (12, 13);
our%num = (key => 14);
# Subroutine with the same name
sub num {
return 15;
}
require Data::Dumper;
print "1-1: Access variable from the symbol table.\n";
# Enclosed in ${}, a scalar entry
my $num_from_symbol = ${$main::{num}};
# Array entries, enclosed in @{}
my @num_from_symbol = @{$main::{num}};
# Hash entries, enclosed in %{}
my %num_from_symbol = %{$main::{num}};
print Data::Dumper->Dump([$num_from_symbol], ['* num_from_symbol']);
print Data::Dumper->Dump([\@num_from_symbol], ['* num_from_symbol']);
print Data::Dumper->Dump([\%num_from_symbol], ['* num_from_symbol']);
print "\n";
print "1-2: Call a subroutine from the symbol table.\n";
my $ret_from_symbol = & {$main::{num}};
print "\$ret_from_symbol = $ret_from_symbol\n\n";
print "2-1: Access the variable from the typeglob.\n";
my $num_from_typedglob = ${* main::num}; Enclosed in # ${} is a scalar entry
my @num_from_typedglob = @{* main::num}; If you enclose it with # @{}, the array entry will be
my %num_from_typedglob = %{* main::num}; # %{} is a hash entry
print Data::Dumper->Dump([$num_from_typedglob], ['* num_from_typedglob']);
print Data::Dumper->Dump([\@num_from_typedglob], ['* num_from_typedglob']);
print Data::Dumper->Dump([\%num_from_typedglob], ['* num_from_typedglob']);
print "\n";
print "2-2: Call a subroutine from a typeglob.\n";
my $ret_from_typedglob = & {* main::num};
print "\$ret_from_typedglob = $ret_from_typedglob\n\n";
Perl ABC