[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:17956] Re: perl



角です。

From: Yasutaka SUMI <sum@mwb.biglobe.ne.jp>-
> #型グロブは、あんまり使わない方がいいと思いますよ。

実際のアドレスを追っかけてみましょう。SetValue() 内部で型グロブを使っ
ているので、明示的に指定しないと $number も $address も local 変数扱い
になっているはずです。

以下は $address のアドレスが変わってしまう例です。
SetValue() の外では $number のアドレスは元に戻ります。

どうしても $number も $address も local でやるなら、SetValue() の最後で、

undef *pointer;

を入れると、元通りになります。

--------------------------------------------------------------------
#!/usr/bin/perl -w

use strict;
use vars qw($number $address $pointer);

local $number="210";
local $address="city";

print "Before : <$number:$address>\n";
print "ADDRESS : <" . \$number . ":" . \$address . ">\n\n";
& SetValue ();
print "After  : <$number:$address>\n";
print "ADDRESS : <" . \$number . ":" . \$address . ">\n";

sub SetValue {
    local ($pointer);
    my $keyword = {
        phone   => {pointer=> *number, proc=>1,} ,
        addr   => {pointer=> *address, proc=>1,} ,
    };
    print "Middle1: <$number:$address>\n";
    print "ADDRESS : <" . \$number . ":" . \$address . ">\n\n";

    *pointer=$keyword->{phone}->{pointer};

    print \$pointer . ":$pointer\n\n";
    print "Middle2: <$number:$address>\n";
    print "ADDRESS : <" . \$number . ":" . \$address . ">\n\n";

    *pointer=$keyword->{addr}->{pointer};

    print \$pointer . ":$pointer\n\n";
    print "Middle3: <$number:$address>\n";
    print "ADDRESS : <" . \$number . ":" . \$address . ">\n\n";

#   undef *pointer; # ←後始末のおまじないはコメントをはずす

}
---------------------------------------------------------------------

#おもしろいですね。

-----
Yasutaka SUMI <sum@mwb.biglobe.ne.jp>
http://pgp.nic.ad.jp:11371/pks/lookup?op=get&search=0x8842F549
Key fingerprint = 5F6D 79E1 E52D 2B38 B9B5  13F5 F8E9 F3E1 8842 F549

Follow-Ups
[plamo:17958] Re: perl, 早間義博
References
[plamo:17950] Re: perl, Yasutaka SUMI
[plamo:17952] Re: perl, Yasutaka SUMI
[plamo:17955] Re: perl, Yasutaka SUMI

[検索ページ] [メール一覧]
Plamo ML 公開システム