Perl 我的$\;如果暗示有$\u,请做任何事情
我想答案是肯定的,但我只是想确定一下。所以如果我有Perl 我的$\;如果暗示有$\u,请做任何事情,perl,lexical-scope,Perl,Lexical Scope,我想答案是肯定的,但我只是想确定一下。所以如果我有 sub something { my $_; my @array = ...; while ( @array ) { say; } } 是我的$对传递给用户的参数进行词汇化时是否有效 在这个特殊的例子中,我使用的是,它抱怨我没有使用my$,我怀疑这是一个bug,因为我是在一个隐含的情况下使用它的。简短的回答是肯定的。它使该范围内的函数使用词汇范围的$\uu,而不是全局范围的$\u。如果他们回写到
sub something {
my $_;
my @array = ...;
while ( @array ) {
say;
}
}
是<代码>我的$代码>对传递给用户的参数进行词汇化时是否有效
在这个特殊的例子中,我使用的是,它抱怨我没有使用
my$代码>,我怀疑这是一个bug,因为我是在一个隐含的情况下使用它的。简短的回答是肯定的。它使该范围内的函数使用词汇范围的$\uu
,而不是全局范围的$\u
。如果他们回写到$\uuu
,就像s///
一样,您将拥有一定程度的损坏控制
Per:
“List::Util::first
”在出现词法$\u
(通常由“my$\u
”引入,或由“given
”隐式引入)的情况下行为不正常。为每次迭代设置的变量是包变量,而不是词法变量
类似的问题可能会出现在其他模块中,这些模块提供的函数将块作为其第一个参数,如
foo { ... $_ ...} list
在这本书中,他接着说:
词汇的$_
默认变量$\uuz
现在可以通过如下方式进行词汇化
任何其他词汇变量,带有
简单的
默认在$\uu
上执行的操作将使用词典范围的$\u
版本(如果存在),而不是全局$\u
在“map
”或“grep
”块中,如果先前$\u
是my
”的,则块内的$\u
也是词法的(并且范围是块)
在$已被词汇化的范围内,您仍然可以通过使用$:\u
或更简单地说,通过使用“our$
”覆盖词汇声明来访问$的全局版本
例子
我想提供一些使用此功能的示例:
my $_ = 'BOOM!';
sub something {
my $_; ## Try running with and without
my @array = qw/foo bar baz/;
while ( $_ = pop @array ) {
say;
}
}
something();
say;
还有一个例子
my $_ = 'foo';
sub something {
my $_ = $_; ## Try running with and without
s/foo/bar/;
$_;
}
something();
say;
perl591delta
?哈哈!难怪我的$
听起来那么奇怪。我已经过时了,也不再练习了(您的示例说明了如何使用此功能以及为什么不应使用此功能。如果您发现自己正在编写my$\u0,则说明您做错了什么。如果某个包要求您编写my$\u0,则说明它做错了什么。@Matthew,如果您正在编写一个包,并且不希望将所有核心操作绑定到一个命名变量,则说明y你可以本地化$\uuu
变量。我不是说这是个好主意,只是因为我不完全相信默认变量的想法是个好主意。当然,从最不令人惊讶的角度来看,OO基类型更吸引人。我个人的意见是,除非有技术原因……所有这些特殊变量无论如何,默认情况下应该是词法的。@Ven'Tatsu,$
在被调用函数中可以是词法的,但如果该函数使用
原型,则可以在被调用函数中访问。调用该函数时,$
与任何其他参数一样被别名为@
的元素。请尝试perl-MData::Dumper-e'sub foo(\u0){打印转储程序\@};foo for 1..3;
请不要这样做。我不想成为继您之后的程序员,并且必须弄清楚这一点,特别是因为这是对Perl的最新更改。为什么不创建一个名为循环作用域变量的临时变量呢?这个更改已经有2.5年多的历史了,但使用循环作用域变量是一个好主意。我想说我是just编写了一个快速示例,我使用的不是默认参数的循环。据我所知,词法主题的原始实现已添加。作为对另一个问题的回答。
my $_ = 'foo';
sub something {
my $_ = $_; ## Try running with and without
s/foo/bar/;
$_;
}
something();
say;