为什么在文件范围内使用“my”声明Perl变量?

我正在学习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

但是我不知道你怎么会让你发布的代码严格地工作并且缺少我的代码.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...