【发布时间】:2020-05-09 17:20:04
【问题描述】:
假设我有东西
package Foo;
my $bar;
我如何判断 $bar 是否已声明而不管它是否未初始化?
在某种程度上我认为这是可能的,因为warnings 知道它,这里warnings 知道变量$bar 存在,所以你只会收到一个未初始化的警告。
$ perl -wE'my $bar; print $bar;'
Use of uninitialized value $bar in print at -e line 1.
但是once 警告类知道这里甚至没有声明变量$baz。
$ perl -wE'my $bar; print $baz;'
Name "main::baz" used only once: possible typo at -e line 1.
Use of uninitialized value $baz in print at -e line 1.
同样,strict 将停止编译,因此它也必须知道这一点(注意 die 永远不会触发)。
$ perl -wE'use strict; my $bar; print $baz; die 42;'
Global symbol "$baz" requires explicit package name (did you forget to declare "my $baz"?) at -e line 1.
Execution of -e aborted due to compilation errors.
所以它也必须知道这一点。
【问题讨论】:
-
只是想一想,我们先忽略包和词法共享同一个变量名的可能性,引用变量,检查它是否存在于当前包哈希表中。
-
@Сухой27 包哈希表没有词法变量。它只有包变量(
our) -
这就是重点,如果你在那里没有找到任何东西,那么你就参考了一个词汇。
-
您是否尝试过使用
PadWalker模块?在 Perl 中没有内置的方法可以对词法变量进行反射,因此您需要一些 XS 代码。 -
听起来您正在尝试确定是否已声明 lexical 变量,这是严格的“vars”要求的事情之一。要以编程方式检测这一点,您需要使用 PadWalker 之类的东西查看垫。 pad 与任何包存储无关,仅与词法范围无关。
标签: perl variables variable-declaration