为什么在同一个脚本中有些变量需要初始化而有些不需要?
Why do some variables require initialization and some don't in the same script?
我正在尝试使用 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));
如果我在创建变量 $c
和 $dis
时遗漏了 my
,我会收到一条错误消息:
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"?)
但是,我没有收到任何因变量 $a
和 $b
遗漏它而导致的错误消息。这是为什么?此外,即使我省略 use strict
,我也会收到错误消息。我认为 Perl 允许您使用未初始化的变量,如果您不这样做的话。
这是因为您碰巧选择了两个变量($a
和 $b
),它们在所有包中始终被声明为全局变量 - 因此它们始终可以在不声明的情况下使用。如果您选择了 $A
和 $B
,如果您没有选择 my
,您将得到与 $c
和 $dir
相同的错误。
进一步阅读 $a
和 $b
@
perlmaven.com
: Don't use $a
and $b
outside of sort, not even for examples
我正在尝试使用 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));
如果我在创建变量 $c
和 $dis
时遗漏了 my
,我会收到一条错误消息:
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"?)
但是,我没有收到任何因变量 $a
和 $b
遗漏它而导致的错误消息。这是为什么?此外,即使我省略 use strict
,我也会收到错误消息。我认为 Perl 允许您使用未初始化的变量,如果您不这样做的话。
这是因为您碰巧选择了两个变量($a
和 $b
),它们在所有包中始终被声明为全局变量 - 因此它们始终可以在不声明的情况下使用。如果您选择了 $A
和 $B
,如果您没有选择 my
,您将得到与 $c
和 $dir
相同的错误。
进一步阅读 $a
和 $b
@
perlmaven.com
: Don't use $a
and $b
outside of sort, not even for examples