为什么有些变量需要初始化而有些变量不需要在同一个脚本中?

qwe*_*rty 4 perl scope global-variables strict

我正在试验 Perl,并编写了以下二次方程求解器。

#! perl
use strict;
use Math::Complex;
use v5.22;

say "Quadratic Equation Solver";

print "Enter a: ";
$a = <STDIN>;

print "Enter b: ";
$b = <STDIN>;

print "Enter c: ";
my $c = <STDIN>;

my $dis = ($b ** 2) - (4 * $a * $c);

say "x1 = ".((0 - $b + sqrt($dis)) / (2 * $a));
say "x2 = ".((0 - $b - sqrt($dis)) / (2 * $a));
Run Code Online (Sandbox Code Playgroud)

如果我my在创建变量$cand时省略$dis,我会收到一条错误消息,内容如下:

Global symbol "$c" requires explicit package name (did you forget to declare "my $c"?)
Global symbol "$dis" requires explicit package name (did you forget to declare "my $dis"?)
Run Code Online (Sandbox Code Playgroud)

但是,我没有收到任何错误消息,因为变量$a$b. 这是为什么?此外,即使我遗漏了use strict. 我认为 Perl 允许你使用未初始化的变量,如果你忽略它的话。

Ted*_*gmo 5

这是因为您碰巧选择了在所有包中始终声明为全局变量的两个变量 ($a$b) - 因此它们始终可以在不声明的情况下使用。如果你选择了$Aand $B,你会得到和 for 一样的错误$c$dir如果你离开my了。

进一步阅读$aand $b@ perlmaven.com:不要使用$aand$b排序之外,即使是示例也不行

  • @ap这是因为你`use v5.22;` - “_如果指定的Perl版本大于或等于5.12.0,则像`use strict`一样在词法上启用限制。_” (5认同)