私たちの:
our $ref = "test";
my $var = "ref";
print "$$var"; #the output will be test
じぶんの:
my $ref = "test";
my $var = "ref";
print "$$var\n"; #the output is blank
私たちの:
our $ref = "test";
my $var = "ref";
print "$$var"; #the output will be test
じぶんの:
my $ref = "test";
my $var = "ref";
print "$$var\n"; #the output is blank
違いは、レキシカル変数を設定するのour
に対し、パッケージ変数を設定することです。my
つまり、で宣言された変数はour
現在のスコープ外でアクセスできるということです。
use strict;
use warnings;
{
our $g = 5;
}
{
print our($g), "\n";
}
5
レキシカル変数は特定のスコープにのみ存在します。
{
# stored in this block
my $l = 5;
{
# accessible from this block
print $l, "\n";
$l = 6;
# new variable stored in this lower block
my $l = 7;
}
print $l, "\n";
}
{
# yet another new variable
print my($l), "\n";
}
5
6
Use of uninitialized value $a in print at -e line 1.
アクセスしようとしたときに、シンボリック参照$$var
を使用していました。パッケージ/グローバル変数でのみ機能します。
our $g = 5;
my $symbolic_ref = 'g';
{
no strict 'refs';
# these are symbolic refs
print $$symbolic_ref, "\n";
print ${ *{$symbolic_ref} }, "\n";
print ${ *{$symbolic_ref}{SCALAR} }, "\n";
}
# access it through the magic %:: variable
print ${ $::{$symbolic_ref} }, "\n";
print ${ $main::{$symbolic_ref} }, "\n";
5
5
5
5
5
これは通常の参照とは対照的です。
my $v = 5;
my $ref = \$v;
print $$ref, "\n";
print ${ $ref }, "\n";
5
5
シンボリック参照を使用する理由はほとんどありません。