2006 年 4 月 7 日 22 時 42 分

lvalue 属性


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


lvalue 属性は、組み込み関数だけでなく、
自作サブルーチンでも使うことができる。

サブルーチンの属性による拡張は、
Perl 5.6 で実装されており、特殊な構文によって指定する。

sub 関数名 : 属性名 {
    # 文……
}

: の後に、属性の名前を指定することで、
サブルーチンが特別な意味を持つようになる。

lvalue 属性の特性は、サブルーチンに対する
代入の構文が使えるようになるというものである。

自作サブルーチンに lvalue 属性を指定した場合、
サブルーチンの最後の文として、
代入が可能なスカラ変数を単独で指定する。

このスカラ変数は、サブルーチンを呼び出した場合は、
サブルーチンの戻り値として利用され、
サブルーチンへ代入を行った場合は、
この変数への代入のように処理されるのだ。

sub 関数名 : lvalue {
    # 文……
    スカラ変数;
}

試してみよう。

========== lvalue_test.pl ==========

#!/usr/local/bin/perl

use strict;
use warnings;

my $value;

sub func : lvalue {
    print "func called.\n";
    $value;
}

$value = 'ONE';
print func, "\n";

func = 'TWO';
print "$value\n";

print func = 'THREE', "\n";

========== end of lvalue_test.pl ==========

実行してみる。

$ ./lvalue_test.pl
func called.
ONE
func called.
TWO
func called.
THREE


今回 func サブルーチンが lvalue の属性を持ち、
代入先には、ファイルスコープの $value を指定している。
そのため、func に代入した場合、$value が更新される。

なので、$value に直接代入していないにも拘らず、
$value の値が更新されるのだ。

また、lvalue によって、以下の記述ができるようになる。

func = 'TWO';

これは、まさにプロパティの構文に近いものだ。
func が高級言語のグローバル変数のように見える。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.