Perl 为什么';这个词汇变量在循环后是否保留其值?
以下是我的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
use strict;
use warnings;
my @words = ("alpha", "bravo", "charlie");
(my $word = $_) foreach @words;
print $word;
我希望这段代码能做以下两件事之一:
$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结构。这与如何在同一词法范围内声明两个同名变量有关,后一个变量掩盖前一个变量,使其不再可用(除非您引用了它)。