为什么我的Perl脚本抱怨“全局符号”$ connection“需要显式包名”?

时间:2009-03-25 18:28:32

标签: perl

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;

以上代码死于:

Global symbol "$connection" requires explicit package name

修改 这个问题与:

有关

希望原始海报能够清理它,这样更有意义,但这是我们迄今为止所做的,所以我们可以尝试提供帮助。

3 个答案:

答案 0 :(得分:3)

虽然肯特的回答在考虑,但错误只是告诉你,你没有声明 $connection作为词法(“我的”)变量。因此,perl将其解释为您必须引用包全局。

当您使用未定义的变量时,Raw Perl不会抱怨,它认为它是一个全局包。您似乎在某处(标准和推荐的练习)有strict,这要求您在使用之前声明变量。如果你没有在当前包(或“namespace”)中声明变量,它会假定你引用了另一个包中声明的变量,所以它会要求你附加包名,只是为了保持一切清晰和高于一切。

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

my $connection = "Rainbow";

OR

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分钟没有看到它并想知道你的查询是否错误,或者其他什么。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

回复:

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

如果您打算使用&amp;在函数调用中,请确保使用括号:

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

否则,当前正在执行的子参数可供您调用的子程序(并可由其替换)。

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

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

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