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

如何在perl中正确使用全局变量

发布时间:2020-12-15 23:28:00 所属栏目:大数据 来源:网络整理
导读:我是perl的新手.我试图通过编写一些程序来理解它.在perl中确定范围让我很难过. 我写了以下内容: use 5.16.3;use strict;use Getopt::Long;Getopt::Long::Configure(qw(bundling no_getopt_compat));ArgParser;our ($sqluser,$sqlpass);$sqluser="root";$sql
我是perl的新手.我试图通过编写一些程序来理解它.在perl中确定范围让我很难过.

我写了以下内容:

use 5.16.3;
use strict;
use Getopt::Long;

Getopt::Long::Configure(qw(bundling no_getopt_compat));
&ArgParser;
our ($sqluser,$sqlpass);

$sqluser="root";
$sqlpass="mypassword";

sub ArgParser {
    print "Username is ".$sqluser." Password is ".$sqlpass."n";
    my $crt='';
    my $delete='';
    GetOptions ('create|c=s' => $crt,'delete|d=s' => $delete
    );
    if ($crt) {
        &DatabaseExec("create",$crt);   
    } elsif ($delete) {
        &DatabaseExec("delete",$delete);    
    } else {
    print "No options chosenn";
    }
}

sub DatabaseExec {
    use DBI;
    my $dbname=$_[1];
    print "Username is ".$sqluser." Password is ".$sqlpass."n";
    my $dbh = DBI->connect("dbi:mysql:",$sqluser,$sqlpass);
    my $comand=$_[0];
    if ($_[0] eq "create") {
        my $db_com="create database ".$dbname;
        print 1 == $dbh->do($db_com) ? "Database createdn":"An error occured while creating database. Maybe it exists?n";
        #print "Executing: ".$db_com."n";
    } elsif ($_[0] eq "delete") {
        my $db_com="DROP DATABASE ".$dbname;
        #print "Executing: ".$db_com."n";
        print 1 == $dbh->do($db_com) ? "Database deletedn":"An error occured while creating database. Maybe it exists?n";
    }
}

我的理解是,我们会将这些声明为主代码和子程序的全局变量.但是,这给出了以下输出:

#~/perlscripts/dbtest.pl -c hellos
Use of uninitialized value $sqluser in concatenation (.) or string at /root/perlscripts/dbtest.pl line 20.
Use of uninitialized value $sqlpass in concatenation (.) or string at /root/perlscripts/dbtest.pl line 20.
Username is  Password is
Use of uninitialized value $sqluser in concatenation (.) or string at /root/perlscripts/dbtest.pl line 44.
Use of uninitialized value $sqlpass in concatenation (.) or string at /root/perlscripts/dbtest.pl line 44.
Username is  Password is
DBI connect('','',...) failed: Access denied for user 'root'@'localhost' (using password: NO) at /root/perlscripts/dbtest.pl line 45.
Can't call method "do" on an undefined value at /root/perlscripts/dbtest.pl line 50.

我不想将这些作为参数传递给sub,而宁愿将它们用作全局变量.有人可以帮我确定我对范围界定的误解吗?

解决方法

调用子例程时,不会声明变量:

&ArgParser;                 # subroutine call
our ($sqluser,$sqlpass);    # declaration

$sqluser="root";            # assignment
$sqlpass="mypassword";

为了在子例程中使用这些全局变量,将子例程放在变量声明之后.

但是,使用全局变量是一件坏事,您应该尽可能避免使用它.你可以这样做,例如:

my $sqluser = "root";
my $sqlpass = "mypass";

ArgParser($sqluser,$sqlpass);    # you should not use & in subroutine calls

然后在子程序内:

sub ArgParser {
    my ($sqluser,$sqlpass) = @_;
    ...

这样,您的变量就可以很好地封装,并且不会被意外操作.

关于&符号&在子程序调用中,这在perldoc perlsub中记录:

To call subroutines:

NAME(LIST);   # & is optional with parentheses.
NAME LIST;    # Parentheses optional if predeclared/imported.
&NAME(LIST);  # Circumvent prototypes.
&NAME;        # Makes current @_ visible to called subroutine.

(编辑:李大同)

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

    推荐文章
      热点阅读