Drkcore

04 03 2009 perl Tweet

perlのlocal

ふと気になったので。

use Perl6::Say;

our $a = 10;

say "\*a(G):\t",\*a,"\t\$a=$a\t", \$a;
my $x = \$a;
my $y;

{
  local $a = 20;
  $y = \$a;
  say "\*a(L):\t",\*a,"\t\$a=$a\t", \$a;
  say "\*x:\t",\*x,"\t\$x=$$x\t", $x;
}

say "\*a(G):\t",\*a,"\t\$a=$a\t", \$a;
say "\*x:\t",\*x,"\t\$x=$$x\t", $x;
say "\*y:\t",\*y,"\t\$y=$$y\t", $y;

これを実行する

$ perl typet.pl
*a(G): GLOB(0x80f480)  $a=10  SCALAR(0x80f4e0)
*a(L): GLOB(0x80f480)  $a=20  SCALAR(0x8041c0)
*x:    GLOB(0x832f50)  $x=10  SCALAR(0x80f4e0)
*a(G): GLOB(0x80f480)  $a=10  SCALAR(0x80f4e0)
*x:    GLOB(0x832f50)  $x=10  SCALAR(0x80f4e0)
*y:    GLOB(0x8330b0)  $y=20  SCALAR(0x8041c0)

型グロブはlocal宣言しても同じメモリ上の位置を見に行く(0x80f480)。そこから先、つまり$(*a)の結果が変わる。元の変数が待避されるってのはリファレンスがいじられるってことか。

ということは、値の入ってるメモリの位置さえ分かっていれば、localで宣言する前の値にアクセスできるし($x)、localで宣言した値をスコープの外へ持ち出すってことも可能($y)なのね。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021