我正在学习Perl,并且在从命令行运行程序与在调试器中以交互方式执行它之间存在一些不一致。
具体来说,我使用perl -d -e 1
调用Perl调试器,并逐行运行此代码
my $a = 1;
print $a;
$b = 2;
print $b;
在输出中,我只看到$b
的值,而$a
似乎未定义。同时,当我用perl myscript.pl
执行相同的语句时,两个值都显示在输出中。为什么会这样?我错过了什么?
答案 0 :(得分:10)
调试器与运行时Perl完全不同。您输入的每一行都表现得像一个单独的块,如果您声明一个词汇变量,如my $a
,那么它将在命令后立即删除。
就像你写过
一样{ my $a = 1; }
{ print $a; }
{ $b = 2; }
{ print $b; }
通常,您会在程序中的适当位置声明词法变量,以便它们在您需要之前不会消失。但是,如果您想使用调试器来使用该语言,那么您只需要使用 package 变量,这些变量永远不会消失,如果您不使用my
,则默认情况下会获得这些变量。
命令行“one-liner”Perl程序通常会做同样的事情,但是当你来编写适当的Perl程序时,你将不得不忘记这一课。您将在每个程序的开头使用use strict
和use warnings
,strict
要求您使用{{1}在词法或包变量之间选择分别是{或my
。如果您尝试使用之前未声明过的变量,那么您的程序将无法编译。
此外永远在您的代码中使用our
或$a
。除了可怕的变量名称之外,它们还保留供$b
运算符使用。
我希望有所帮助。