perl中的动态变量
发布时间:2020-12-15 21:52:49 所属栏目:大数据 来源:网络整理
导读:我想知道我在Perl中如何做我在lisp中常做的事情: (defvar *verbose-level* 0)(defun my-function (... key ((:verbose-level *verbose-level*) *verbose-level*) ...) ...) 这意味着my-function以当前的详细程度运行,但是我可以将它传递给不同的级别,这也会
我想知道我在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;. 解决方法
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)接口的包提供配置.重要的例子是 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |