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

从Perl 5.10开始,现在可以在词汇上定义上下文变量
$\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') { ...