Perl 5.10+;
从Perl 5.10开始,现在可以在词汇上定义上下文变量Perl 5.10+;,perl,global,lexical,perl5.10,Perl,Global,Lexical,Perl5.10,从Perl 5.10开始,现在可以在词汇上定义上下文变量$\uuz,或者显式地定义为my$\ux或在给定/当构造中 有人发现词法$\uu有很好的用法吗?它是否使任何构造更简单/更安全/更快 让情况变得更复杂的情况如何?词法$\uuz是否在代码中引入了任何错误?(由于写入$的控件结构如果在作用域中,将使用词法版本,因此如果代码包含任何子例程调用(由于失去动态作用域),这可能会更改代码的行为。) 最后,我想构建一个列表,明确何时使用$\uuu作为词法、全局或根本不重要 NB:从perl5-5.24
$\uuz
,或者显式地定义为my$\ux代码>或在给定/当构造中
有人发现词法$\uu
有很好的用法吗?它是否使任何构造更简单/更安全/更快
让情况变得更复杂的情况如何?词法$\uuz
是否在代码中引入了任何错误?(由于写入$的控件结构如果在作用域中,将使用词法版本,因此如果代码包含任何子例程调用(由于失去动态作用域),这可能会更改代码的行为。)
最后,我想构建一个列表,明确何时使用$\uuu
作为词法、全局或根本不重要
NB:从perl5-5.24
开始,这些实验性功能都是。在这里没有任何问题,尽管我倾向于遵循“不问,不说”的政策。也就是说,常规训练通常不会依赖于同伴干扰非词汇数据作为副作用,也不会让他们这样做
我已经针对各种5.8和5.10版本的perl测试了代码,同时使用5.6描述骆驼作为偶尔的参考。没有任何问题。我的大部分内容最初都是为perl 5.8.8编写的。IMO,从词法$\uu
中产生的一个伟大的东西是新的\u
原型符号
这允许您指定一个子例程,以便它将采用一个标量,或者如果没有提供标量,则它将获取$\uu
因此,与其写:
sub foo {
my $arg = @_ ? shift : $_;
# Do stuff with $_
}
我可以写:
sub foo(_) {
my $arg = shift;
# Do stuff with $_ or first arg.
}
这不是一个很大的改变,但当我想要这种行为时,它就简单多了。去除样板是一件好事
当然,这会产生连锁反应,改变几个内置的原型(例如chr
),这可能会破坏一些代码
总的来说,我欢迎词法$\uu
。它给了我一个工具,我可以用它来限制意外的数据消耗和函数之间奇怪的交互。如果我决定在函数体中使用$\uuu
,通过对其进行词汇化,我可以确保无论调用什么代码,$\uu
都不会在调用代码时被修改
动态范围很有趣,但在很大程度上我需要词法范围。再加上$的复杂性
。我听到过一些可怕的警告,说单纯做local$\
--最好使用代替($foo){}
。当我以任何方式本地化$\ucode>时,词汇化$\ucode>在100次中有99次给了我想要的东西。词法$\uuuz
使一个非常方便且可读性更强的功能更加强大
我的大部分工作都必须使用perl 5.8,因此我没有在更大的项目中使用词法$\uu
的乐趣。然而,感觉这将大大提高$的使用安全性,这是一件好事。我曾经发现一个(bug这个词太强了)在我玩模块时出现。这个简单的脚本:
use strict qw(vars subs);
for ('function') {
$_->();
}
sub function {
require Inline;
Inline->bind(C => <<'__CODE__');
void foo()
{
}
__CODE__
}
或者以其他方式声明my$\是解决此问题的可行方法
(对内联模块进行了修补以解决此特定问题)。[基本原理:一个简短的补充答案,其中包含可能经过的perl新手的快速总结。搜索“perl词汇主题”时,可以在此处结束。]
到现在(2015年),我想大家都知道,词汇主题(my$
和一些相关功能)的引入导致了一些难以在一开始就发现的非预期行为,因此进入了一个新的阶段
的部分摘要:
一个建议是使用类似的特性“lextopic”代码>。
提出的另一点是,当与显式词法函数(例如词法map
或lmap
)结合使用时,“”将最有效。目前尚不清楚这些方法是否能以某种方式挽救给定/时的。在实验和折旧阶段的来世,也许有什么东西最终会生活在卡潘河中。
我想你的问题的答案大部分都包含在我的问题的答案中。@Xeoterracide=>那里的答案当然涵盖了词法$\uu
的一些方面,但不是全部。这就是我想在这里介绍的内容。我知道,但最好有一个好地方开始;)好问题。我想+1,但我的票数用完了。:)对于($foo){…}
而不是local*\$foo,给出了什么原因代码>?根据我的经验,后者要快一点(因为它不必为单个元素列表设置作用域和迭代器),但我想知道是否有任何安全问题需要记住。Eric,我今天去寻找特定的引用,但找不到它。在这一点上,我所能记得的是,2009年年中某个时候,来自“我尊重其意见的人”的local$警告。因此,除非我能更好地证实这一说法,否则最好不要把它当作道听途说。该声明称,本地化并没有覆盖所有具有公认特殊的$\uuu
的边缘情况。我从未找到错误报告或测试用例来支持警告。
for my $_ ('function') { ...