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;