【问题标题】:Why does my Perl script complain about 'Global symbol "$connection" requires explicit package name'?为什么我的 Perl 脚本会抱怨“全局符号“$connection”需要显式包名”?
【发布时间】:2009-03-25 18:28:32
【问题描述】:
my $now = &GetDate;
my $myHeader = &ReadMessage;
my $mySoftwareVersions = param('mySoftwareVersions');
my $q = new CGI;print $q->header();

use CGI::Carp(fatalsToBrowser);
getAllSoftwareVersions();

sub getAllSoftwareVersions
{
        my $user = "zxxx";
        my $passwd = "xxxx";
#       my $tableName = "config_table";
#       my $connection = DBI->connect("DBI:mysql:MESCI:hamysql02.stl.mo.boeing.com:18080", $user, $passwd, { AutoCommit => 0, RaiseError => 1}) or die "Couldn't connect to Database: " . DBI->errstr;
        print "Must be connected\n\n";
        print "\n\n";
# Error here.
        my @Rows = &getConfigTableRows($connection, $config_table, $mySoftwareVersions );
        my $total = @Rows;
        print "total is ";
        print $total;

上面的代码死了:

全局符号“$connection”需要明确的包名

编辑 这个问题与:

希望原始发帖人能够将其清理干净,以便更有意义,但这是我们目前所获得的,因此我们可以尝试提供帮助。

【问题讨论】:

  • 这要好得多,但对于不了解您发布的其他问题的人来说,这仍然会让人感到困惑。请尽量不要对一个问题提出 3 个问题,只需使用底部的“编辑”链接逐步改进即可。
  • 另外,您可能想阅读这篇文章,它的存在是为了阻止您陷入社区反应不佳的常见陷阱:stackoverflow.com/questions/469150/…

标签: perl


【解决方案1】:

虽然 Kent 的回答是提前考虑,但错误只是告诉您您没有声明 $connection 作为词法 ( "my" ) 变量。因此,perl 将其解释为您必须引用全局包。

当你使用一个未定义的变量时,Raw Perl 不会抱怨,它认为它是一个全局包。您似乎在某处有strict(标准和推荐的做法),它希望您在使用变量之前声明它们。如果您没有在当前包(或“命名空间”)中声明变量,则假定您指的是在另一个包中声明的变量,因此它会要求您附加包名称,以保持一切清晰明了.

Perl 使用my 来声明作用域变量,并使用our 来声明包全局变量。

my $connection = "Rainbow";

our $connection = 'French';


以防万一你有错误的想法,如果你关闭严格,错误消息会消失,你的问题不会。他们可能会进入地下。
{ no strict;
  my @rows = getConfigTableRows( $nothing, @other_stuff ); 
}

Perl 不会抱怨 $nothing 什么都不是。而这个易于修复的错误可能会在其他地方导致更细微的错误。另外想想如果你已经成功分配了$connection,只需输入:

{ no strict;
  my @rows = getConfigTableRows( $connecion, $config_table, $mySoftwareVersions );
}

Perl 给你一个关于'$connecion' 的消息,希望你能看出这是一个错字,并且放弃至少 30 分钟没有看到它并怀疑你的查询是否错误,或者其他什么。

【讨论】:

  • 尝试改写它,你让它听起来像“严格”是一件坏事。
  • 我在解释推论,我不认可任何东西。这有助于理解为什么 Perl 不会因“未声明的变量”错误而失败——因为在 perl 的超集中,未声明的变量不是编译错误;他们只是有一定的推论。
  • 是的,但措辞仍然没有传达这一点。它的措辞本能地暗示“哦,只是关闭严格”。我知道它不是故意的,但它就是这样读取的。
【解决方案2】:

好吧,如果这是其他问题的相关内容,

这是错误的原因是因为您已经注释掉了创建连接变量的行。

如果您没有定义数据库连接,您将如何在数据库中查询表行?

【讨论】:

    【解决方案3】:

    回复:

    my $now = &GetDate;
    my $myHeader = &ReadMessage;
    

    如果您要在函数调用中使用 &,请确保也使用括号:

    my $now = &GetDate();
    my $myHeader = &ReadMessage();
    

    否则,当前正在执行的子程序的参数对您正在调用的子程序可用(并且可以更改)。

    这意味着如果你在 mod_perl 下使用你的 cgi 脚本,突然间你正在做

    my $now = &GetDate( Apache2::RequestUtil->request );
    

    如果 GetDate 采用可选参数,这可能是非常错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多