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