我的目标是每次将值分配给“受监控”变量时,我想:
一个真实世界的例子是,当光标在文档中移动时,状态栏中的编辑器中的光标位置会发生变化。
我理解目标1.很容易满足以下代码段。
$a = 52;
print LOG "\$a = [$a]\n";
我的偏好是代码如下所示:
$a = 52;
在其他地方(对象,程序,重载操作符),打印神奇地发生。
答案 0 :(得分:5)
您可以通过将标量变量绑定到处理日志记录的包来完成此操作。绑定允许您定义被调用的子节点,以便实际存储,获取等值。
请参阅perltie和Tie::Scalar。
这是一个有效的例子:
#!/usr/bin/perl
use strict;
use warnings;
package LogScalar;
use Tie::Scalar;
our @ISA=qw(Tie::StdScalar);
sub STORE {
my ($this, $value)=@_;
print "LOG: Storing $value in $this\n";
$this->SUPER::STORE($value)
}
package main;
my $v;
tie $v, 'LogScalar';
$v=100;
print "v = $v\n";
输出:
LOG: Storing 100 in LogScalar=SCALAR(0x1ff0890)
v = 100
答案 1 :(得分:1)
捆绑的变量有很多开销。使用绑定变量,从变量读取将花费大约一百倍的时间。通过更有针对性的魔法来避免一些开销很容易。
use Variable::Magic qw( wizard cast );
cast $i, wizard( set => sub { print "\$i = [${$_[0]}]\n"; } );
$i = 52; # Outputs $i = [52]