我正在学习Perl并尝试理解变量范围.我明白我的$name =’Bob’;将在sub中声明一个局部变量,但为什么要在全局范围内使用my关键字?它只是一个好习惯,所以你可以安全地将代码移动到子?
我看到很多这样做的示例脚本,我想知道为什么.即使使用严格,当我删除我的时候也不会抱怨.我试过比较有和没有它的行为,我看不出任何区别.
这是one example这样做:
#!/usr/bin/perl use strict; use warnings; use DBI; my $dbfile = "sample.db"; my $dsn = "dbi:sqlite:dbname=$dbfile"; my $user = ""; my $password = ""; my $dbh = DBI->connect($dsn,$user,$password,{ PrintError => 0,raiseerror => 1,AutoCommit => 1,FetchHashKeyName => 'NAME_lc',}); # ... $dbh->disconnect;
更新
当我测试这种行为时,我似乎不走运.这是我测试过的脚本:
use strict; my $a = 5; $b = 6; sub print_stuff() { print $a,$b,"\n"; # prints 56 $a = 55; $b = 66; } print_stuff(); print $a,"\n"; # prints 5566
正如我从这里的一些答案中学到的那样,$a和$b是已经声明的特殊变量,因此编译器不会抱怨.如果我在该脚本中将$b更改为$c,那么它会抱怨.
至于为何在全局范围内使用我的$foo,似乎文件范围实际上可能不是全局范围.
解决方法
这只是一种很好的做法.作为个人规则,我尝试将变量保持在尽可能小的范围内.如果一行代码看不到变量,那么它就不会以意想不到的方式搞乱它.
我很惊讶你发现这个脚本在没有我的情况下使用严格.通常不允许这样做:
$perl -E 'use strict; $db = "foo"; say $db' Global symbol "$db" requires explicit package name at -e line 1. Global symbol "$db" requires explicit package name at -e line 1. Execution of -e aborted due to compilation errors. $perl -E 'use strict; my $db = "foo"; say $db' foo
变量$a和$b免除:
$perl -E 'use strict; $b = "foo"; say $b' foo