如何在perl中分配监视变量来打印消息?

时间:2014-01-30 00:34:15

标签: perl

我的目标是每次将值分配给“受监控”变量时,我想:

  1. 在日志文件中注册更改或将其显示在状态区域
  2. 保持代码整洁。
  3. 一个真实世界的例子是,当光标在文档中移动时,状态栏中的编辑器中的光标位置会发生变化。

    我理解目标1.很容易满足以下代码段。

    $a = 52;
    print LOG "\$a = [$a]\n";
    

    我的偏好是代码如下所示:

    $a = 52;
    

    在其他地方(对象,程序,重载操作符),打印神奇地发生。

2 个答案:

答案 0 :(得分:5)

您可以通过将标量变量绑定到处理日志记录的包来完成此操作。绑定允许您定义被调用的子节点,以便实际存储,获取等值。

请参阅perltieTie::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]