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

前端之家收集整理的这篇文章主要介绍了为什么在文件范围内使用“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

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

猜你在找的Perl相关文章