perl中的动态变量



我想知道如何在Perl中做我通常在lisp中做的事情:

(defvar *verbose-level* 0)
(defun my-function (... &key ((:verbose-level *verbose-level*) *verbose-level*) ...) ...)

这意味着my-function以当前的冗长级别运行,但我可以传递给它一个不同的级别,这也会影响它的所有调用:

(defun f1 (&key ((:verbose-level *verbose-level*) *verbose-level*))
  (format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*)
  (f2 :verbose-level 1)
  (format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*)
  (f2 :verbose-level (1+ *verbose-level*))
  (format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*))
(defun f2 (&key ((:verbose-level *verbose-level*) *verbose-level*))
  (format t "~S: ~S=~S~%" 'f2 '*verbose-level* *verbose-level*))
[17]> (f1)
F1: *VERBOSE-LEVEL*=0
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=0
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=0
NIL
[18]> (f1 :verbose-level 4)
F1: *VERBOSE-LEVEL*=4
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=4
F2: *VERBOSE-LEVEL*=5
F1: *VERBOSE-LEVEL*=4

(注意,变量绑定在退出(甚至异常退出)函数时被恢复)。

我如何在Perl中做这样的事情?

。在misc.pm中,有our $verbose=0;。我如何写一个函数,将$verbose绑定到其参数的值,并恢复其返回值?

Perl的全局变量概念与CL中的特殊变量非常相似。

你可以使用local:

来"shadow"全局变量的值
our $var = 1;
func("before");
{
  # a block creates a new scope
  local $var = 2;
  func("inside");
}
func("after");
sub func { say "@_: $var" }
输出:

before: 1
inside: 2
after: 1

如果你local一个值,这个新值在整个动态范围内是可见的,即在所有被调用的函数中。一旦以任何方式(错误、返回等)离开词法作用域,就会恢复旧值。尾部调用不扩展动态作用域,但算作退出作用域。

注意全局变量有一个完全限定的名称。在另一个包中,您可以执行如下操作

local $Other::Package::var = 3;
Other::Package::func("from a package far, far away");

这通常用于为具有功能性(非面向对象)接口的包提供配置。重要的例子有CarpData::Dumper .

如果我理解正确的话,您需要在函数内部局部覆盖全局变量。

package my_package;
our $verbose = 0;
sub function {
    my ($arg1, $arg2) = @_; # getting function arguments.
    local $verbose = $arg1;
}

返回时将恢复$verbose的旧状态

相关内容

  • 没有找到相关文章

最新更新