Perlの変数宣言

our, my, local

  • our. パッケージ変数
    スコープの外からでもパッケージ名をつけて参照できる

  • my. レキシカルスコープ
    スコープ内で参照可能な変数を宣言

  • local. ダイナミックスコープ
    グローバルな変数がいた場合一時スタックに退避
    実行時のスコープ内で宣言した値を持つ

スコープ

  • {} で囲われた範囲
    localやmyはスコープを外れた場所から参照できない

レキシカルスコープとダイナミックスコープ

  • レキシカルスコープ

静的なスコープ
コードに書かれた {} 内でのスコープ

our $hoge;
sub B{
    return $hoge;
}
sub A{
    my $hoge;
    return B;
}

Aのみで参照可能

  • ダイナミックスコープ

動的スコープ
実行時のスコープで参照可能

our $hoge;
sub B{
    return $hoge;
}
sub A{
    local $hoge;
    return B;
}

実行時A内でBが呼ばれるので、AB内で参照可能

ちょっと分かり難かったので検証

#!/usr/local/bin/perl

package test;

use strict;
use warnings;

our $hoge = "hello";

sub localtest
{
        local $hoge = "good";
        print "localtest\n";
        print "$hoge\n";
        print "$test::hoge\n";
}

sub mytest
{
        my $hoge = "good";
        print "mytest\n";
        print "$hoge\n";
        print "$test::hoge\n";
}

mytest;
localtest;

実行結果

localtest
good
good
mytest
good
local

localはパッケージ変数に(元値はスタックに退避して)上書き
myは別に同名の変数を持つみたい

参照

http://d.hatena.ne.jp/TAKESAKO/20080110/1199969773 http://d.hatena.ne.jp/perlcodesample/20110128/1300165343