加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:20:51 所属栏目:大数据 来源:网络整理
导读:我正在学习Perl并尝试理解变量范围.我明白我的$name =’Bob’;将在sub中声明一个局部变量,但为什么要在全局范围内使用my关键字?它只是一个好习惯,所以你可以安全地将代码移动到子? 我看到很多这样做的示例脚本,我想知道为什么.即使使用严格,当我删除我的时
我正在学习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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读