Perl 为什么';这个词汇变量在循环后是否保留其值?

Perl 为什么';这个词汇变量在循环后是否保留其值?,perl,Perl,以下是我的Perl代码: use strict; use warnings; my @words = ("alpha", "bravo", "charlie"); (my $word = $_) foreach @words; print $word; 我希望这段代码能做以下两件事之一: 打印字符串“charlie”,这是循环完成后$word的最终值 抱怨编译错误,因为my$word是一个词法变量,其作用域是foreach循环;它不存在于最后一行 相反,$word的值似乎是undef,P

以下是我的Perl代码:

use strict;
use warnings;

my @words = ("alpha", "bravo", "charlie");

(my $word = $_) foreach @words;

print $word;
我希望这段代码能做以下两件事之一:

  • 打印字符串“charlie”,这是循环完成后
    $word
    的最终值
  • 抱怨编译错误,因为
    my$word
    是一个词法变量,其作用域是
    foreach
    循环;它不存在于最后一行
  • 相反,
    $word
    的值似乎是
    undef
    ,Perl发出警告并打印空字符串

    为什么?

    来自

    注意:使用语句修饰符条件或循环构造(例如,my$x if…)修改的my、state或our的行为是未定义的。my变量的值可能是未定义的、任何先前指定的值,或者可能是任何其他值。不要依赖它。未来版本的perl可能会做一些与您试用的perl版本不同的事情。这里有龙

    注意:使用语句修饰符条件或循环构造(例如,my$x if…)修改的my、state或our的行为是未定义的。my变量的值可能是未定义的、任何先前指定的值,或者可能是任何其他值。不要依赖它。未来版本的perl可能会做一些与您试用的perl版本不同的事情。这里有龙


    我有点惊讶于
    警告
    严格
    没有抱怨,因为对我来说这看起来像是不在范围内的变量。我有点惊讶于
    警告
    严格
    没有抱怨,因为对我来说这看起来像是不在范围内的变量。但为什么?为什么Perl不简单地声明
    表达式foreach LIST
    在语法上完全等同于
    foreach(LIST){EXPRESSION}
    ?这不是更简单、更可预测吗?因为它不是完全等价的。使用语句修饰符的版本不会创建新的词法范围,因此运行速度要快得多。(因为它不创建新的词法作用域,这也意味着词法变量的作用域不能仅限于该语句。)@tobyink:那么为什么它的值之后不是“charlie”?如何更快地将其值设置回
    undef
    ?与其说变量被设置回
    undef
    ,不如说它指向循环外的另一个SV结构。这与如何在同一个词法范围内声明两个同名变量有关,后一个变量掩盖了前一个变量,使其不再可用(除非您引用了它)。但是为什么呢?为什么Perl不简单地声明
    表达式foreach LIST
    在语法上完全等同于
    foreach(LIST){EXPRESSION}
    ?这不是更简单、更可预测吗?因为它不是完全等价的。使用语句修饰符的版本不会创建新的词法范围,因此运行速度要快得多。(因为它不创建新的词法作用域,这也意味着词法变量的作用域不能仅限于该语句。)@tobyink:那么为什么它的值之后不是“charlie”?如何更快地将其值设置回
    undef
    ?与其说变量被设置回
    undef
    ,不如说它指向循环外的另一个SV结构。这与如何在同一词法范围内声明两个同名变量有关,后一个变量掩盖前一个变量,使其不再可用(除非您引用了它)。