如何在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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |