gpt4 book ai didi

perl - perl 中的动态变量

转载 作者:行者123 更新时间:2023-12-04 10:25:51 30 4
gpt4 key购买 nike

我想知道如何在 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

(请注意,变量绑定(bind)在退出时恢复 - 即使是异常 - 从函数)。

我怎样才能在 Perl 中做这样的事情?

例如,在 misc.pm , 我有 our $verbose=0; .
如何编写绑定(bind) $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一个值,新值在整个动态范围内可见,即在所有被调用的函数中。一旦通过任何方式(错误、返回等)离开词法范围,旧值就会恢复。尾调用不扩展动态范围,但算作范围退出。

请注意,全局变量具有完全限定的名称。从不同的包中,你会做类似的事情
local $Other::Package::var = 3;
Other::Package::func("from a package far, far away");

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

Data::Dumper .

关于perl - perl 中的动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218158/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com