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

2024-01-20

我是 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 chosen\n";
    }
}

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 created\n":"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 deleted\n":"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.

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


调用子例程时未声明变量:

&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 http://perldoc.perl.org/perlsub.html:

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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在perl中正确使用全局变量 的相关文章

随机推荐

  • ServiceStack路由设计

    这3条路线一样吗 通常首选哪一种 Route todo id DELETE Route todo delete POST Route todo delete id GET public class DeleteTodo IReturnVoi
  • 如何为同一发行版中的多个 Perl 模块设计单元测试?

    我一直在开发一个内部框架 它是用一堆 Perl 模块设计的 所有这些模块都依赖于公开一些 Win32 功能的单个模块 例如A B C D 等模块都依赖于单个模块 Z 因此所有这些模块都将通过 use MyFramework Z 导入 所有这
  • Moshi 适配器跳过 List 中的坏对象

    我使用 Moshi 我需要用有问题的后端来解决我的问题 有时 当我请求对象列表时 其中一些不包含必填字段 当然 我可以捕获并处理JsonDataException 但我想跳过这些对象 我怎样才能用莫西做到这一点 Update 我有几个模型可
  • Python scipy/numpy 中相关性的层次聚类?

    如何在相关矩阵上运行层次聚类scipy numpy 我有一个 100 行 x 9 列的矩阵 我想根据 9 个条件中每个条目的相关性进行分层聚类 我想使用 1 pearson 相关性作为聚类距离 假设我有一个numpy array X包含 1
  • 如何解决“构建:未知编译器选项‘listemitedfiles’。”在 Visual Studio 2015 更新 3 上?

    更新 NuGet 类型脚本包后 我遇到了一个常见的构建错误问题 tsc exe 退出 代码为 1 经过搜索 我找到了解决方法 按照建议 我安装了另外两个名为 Microsoft TypeScript Compiler 和 Microsoft
  • Shell执行多个文件

    我想知道是否可以通过某种方式使用 ShellExecute 使用默认动词处理程序一次打开多个文件 例如 如果一个文件夹中有多个 mp3 文件 我可以选择所有文件 然后右键单击并选择 播放 这将打开一个 WMP 实例 这是我的默认 mp3 播
  • 扭曲的 HTTPS 客户端

    我目前在使用扭曲的 python 库访问通过 https 托管的内容时遇到一些问题 我是这个库的新手 并且假设我缺少一些导致问题的概念 但可能不是基于示例 这是我收集示例的页面的链接 https twistedmatrix com docu
  • 如何创建比 Core Plot 生成的图表更好看的图表? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找适合 iPhone 绘制图表 饼图 条形图 的好库 我测试过很多人推荐的Coreplot 但我认为生成的图表看起来很差 I sa
  • 我如何确定哪些是 Facebook 应用程序用户最好的朋友?

    我目前正在尝试使用 Facebook PHP SDK 创建 Facebook 应用程序 我想检索用户的哪些朋友是他最好的朋友 或者是他最常交谈的朋友 您知道获取它们的算法或技巧吗 简单地说 寻找友谊的标记 给每项活动一个权重 合计 朋友分数
  • 将 GET 参数添加到 URL 的语法是什么?

    我在用Python https www python org and 谷歌应用引擎 https cloud google com appengine 我需要通过向网址添加一些元素来访问某些网页 将 GET 参数添加到 URL 的语法是什么
  • 双锚定正则表达式

    我想接受用户的任意正则表达式并将其锚定在两侧以强制完全匹配
  • Maven2 Eclipse 集成

    似乎有两个竞争对手的 Eclipse 插件可以与 Maven 集成 m2Eclipse http m2eclipse codehaus org and q4e http code google com p q4e 最近有人评估或使用过这些插
  • 在 iOS4.1 上保存带有照片的地理标签信息

    我在尝试在 iOS 4 1 上将带有地理标记信息的照片保存到相机胶卷时遇到重大问题 我正在使用以下资产库 API void writeImageDataToSavedPhotosAlbum NSData imageData metadata
  • 切换到内核转储中的用户堆栈

    有没有办法在进行事后调试时切换到内核转储中特定进程的用户模式 我记得在使用 process 命令进行实时调试时执行此操作 process也适用于内核转储 首先 您可以使用以下方式找到您的流程 process 0 0 myprocess ex
  • 多语言 PSGI-web 部署

    我计划使用 PSGI Plack 开发一个 Web 应用程序 可能与 舞者 但尚未决定 应用程序应该是 utf 8 多语言 使用 Locale Maketext 并且 ofc 将包含一些给定语言的静态页面 我的想法是将其部署在不同的语言域中
  • 将 Pyspark 中的 Dataframe 中的不同值转换为列表

    我试图获取 Pyspark 中数据帧中列的不同值 将它们保存在列表中 目前列表包含 Row no children 0 但我只需要该值 因为我将把它用于代码的另一部分 所以 理想情况下只有 all values 0 1 2 3 4 all
  • 如何包装 JUnit 5 测试

    在 JUnit 4 中 您可以使用规则来包装测试 以便您可以在测试运行之前和之后执行代码 在大多数情况下 这可以通过 Before 和 After 方法或ExternalResource 规则来完成 然而 某些控制流构造 例如 try wi
  • 它是一种具有某种特征的好风格,并且有一个扩展该特征的同名对象吗?

    当我浏览的时候保罗 菲利普斯 GitHub 存储库 https github com paulp我注意到他经常使用某种结构 trait A object A extends A 例如这里 scala 改进 字符串 https github
  • 如何在react-VR中将某些元素固定在屏幕上

    我想在 React VR 应用程序中保持分数或健康栏始终可见 我可以使用 VrHeadModel 旋转 yawPitchRoll 和位置 但必须计算它才能保持其固定 似乎我错过了一些东西 我该怎么做呢 更新的要点 由于订阅了 HM 延迟更小
  • 如何在perl中正确使用全局变量

    我是 perl 的新手 我试图通过编写一些程序来理解它 Perl 的范围界定让我很困难 我写了以下内容 use 5 16 3 use strict use Getopt Long Getopt Long Configure qw bundl