【问题标题】:Error-global symbol requires explicit package name错误全局符号需要明确的包名
【发布时间】:2013-05-22 21:41:11
【问题描述】:

我正在尝试以表格格式在网页上打印数据库表格的所有值。我正在使用具有 .cgi 扩展名的 perl 文件。每当我尝试运行代码时,我都会收到错误消息“全局符号需要显式包name"。数据库表的行应该在加载时显示,但它没有发生..

我尝试了很多,但无法理解代码有什么问题..

请帮忙..

people.cgi 文件的代码..

#!/usr/bin/perl
use CGI;
use DBI;
use strict;
use warnings;
print "Content-type:text/html\r\n\r\n";
#$q = CGI->new;
#print  $q->header;
my $dsn = "DBI:mysql:Demo:localhost";   # Data source name
my $username = "mint";                  # User name
my $password = "MINT123";               # Password
my $dbh;
my $sth;                                # Database and statement handles
$dbh = DBI->connect($dsn, $username, $password);

$sth = $dbh->prepare("SELECT * from people");

$sth->execute();

print "<h1>ganesh</h1>";
print "<table >
<tr>
<th>ID</th>
<th>Name of People Involved</th>
<th>Position</th>
<th>Roles(A user can have multiple roles)</th>
<th>Notes</th>
</tr>";
while( $href = $sth->fetchrow_hashref ) {
    print "<tr>";
    print "<td>$$href{'id'}</td>";
    print "<td>$$href{'name'}</td>";
    print "<td>$$href{'pos'}</td>";
    print "<td>$$href{'role'} </td>";
    print "<td>$$href{'notes'}</td>";
    #print "<td><input type='text' value=\"$$href{'display_name'}\" id =\"dis-$$href{'windows_id'}\" readonly> </td>";
    #print "<td><input type='text' value=\"$$href{'email_id'}\" readonly> </td>";
    print "</tr>";
}
print "</table>";

$sth->finish();
$dbh->disconnect();

错误消息..

 Global symbol "$href" requires explicit package name at people.cgi line 31.
 Global symbol "$href" requires explicit package name at people.cgi line 34.
 Global symbol "$href" requires explicit package name at people.cgi line 35.
 Global symbol "$href" requires explicit package name at people.cgi line 36.
 Global symbol "$href" requires explicit package name at people.cgi line 37.
 Global symbol "$href" requires explicit package name at people.cgi line 38.
 Execution of people.cgi aborted due to compilation errors.

我的 MYSQL 表的结构..它有 14 列...里面没有数据...

【问题讨论】:

  • while 循环中用my 声明$hrefwhile (my $href = ...)
  • 我这样做并尝试通过在我的 Web 浏览器上键入包含它在服务器中的位置的 url 来运行该文件,但我收到消息“找不到文件”!!...为什么是吗???

标签: perl cgi


【解决方案1】:

应定义$href(通常使用my 表示局部/词法变量),在这种特殊情况下将其作用域置于while 循环中。

while (my $href = $sth->fetchrow_hashref ) { .. }

【讨论】:

  • 是的,我这样做了,但现在我收到一条错误消息,提示“在连接 (.) 或 people.cgi 第 37 行的字符串中使用未初始化的值。”即在 "print "$$href{'notes'}";...为什么会这样???
  • 在打印undef 值时,%$href 的一些哈希值是 undef 和 pragma use warnings; 警报。在打印它们之前,您可以用 $_ //= "" for values %$href; 将所有 undef 值替换为空字符串。
  • 我已经编辑了我上面的帖子,显示了表格的结构..上面的代码需要做哪些更改??
  • 如果你想避免null/undef 值,你的'role'和'notes'应该有NOT NULL DEFAULT ''
【解决方案2】:

每当您收到您不理解的 Perl 警告或错误时,您应该在您的代码中添加 use diagnostics,Perl 将为您提供有关该问题的更多详细信息。在这种情况下,它会说:

您说过“use strict”或“use strict vars”,这表明 所有变量都必须是词法范围的(使用“my”或“state”), 使用“我们的”预先声明,或明确有资格说哪个 打包全局变量所在的位置(使用“::”)

更新:一些补充内容以回答下面 cmets 中的进一步问题。

如果列可以包含 NULL,并且您将要打印这些列,那么您将收到“未定义值”警告,除非您对此进行处理。

最简单的解决方法可能是在获得哈希后立即清理它。我会在循环块的顶部使用类似这样的东西用空字符串替换未定义的值:

$href->{$_} // '' for keys %$href;

我还注意到您使用的是丑陋的$$hash_ref{key} 语法。不知道你是从哪里得到的,但人们普遍认为$hash_ref-&gt;{key} 看起来更干净。

【讨论】:

  • 是的,我这样做并添加了关键字“my”并声明了“while (my $href = $sth->fetchrow_hashref) { .. }”。现在我收到一个错误说“在 people.cgi 第 37 行的连接 (.) 或字符串中使用未初始化的值。”即在“打印”行“$$href{'notes'}””..为什么会这样???
  • 这不是错误,而是警告。表中的注释列是否允许包含空值?数据库中的 Null 在 Perl 中变为 undef。
  • 是的,它允许包含空值..我已经编辑了我上面的帖子,显示了表格的结构..上面的代码需要做哪些更改??
  • 更新了我的答案以回复此问题。请注意,在 cmets 中提出额外的问题并不是一个好主意。您应该为此发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多