このアーカイブは同期化されません。 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 が高級言語のグローバル変数のように見える。