-1

私たちの:

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
4

1 に答える 1

1

違いは、レキシカル変数を設定するの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

シンボリック参照を使用する理由はほとんどありません。

于 2013-03-20T20:37:04.027 に答える