perl中的动态变量

前端之家收集整理的这篇文章主要介绍了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中,我有$verbose = 0;.
如何编写一个将$verbose绑定到其参数值并在返回时恢复其值的函数

解决方法

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

您可以使用local“遮蔽”全局变量的值:

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 $Other::Package::var = 3;
Other::Package::func("from a package far,far away");

这通常用于为具有功能(非OO)接口的包提供配置.重要的例子是
Carp

Data::Dumper.

猜你在找的Perl相关文章