Perl 错误全局符号需要显式包名

Perl 错误全局符号需要显式包名,perl,cgi,Perl,Cgi,我正在尝试以表格格式打印网页上数据库表的所有值。我正在使用扩展名为.cgi的perl文件。每当我尝试运行代码时,都会发现错误全局符号需要显式的包名。数据库表的行应在加载时显示,但不会发生 我试了很多次,但不明白代码有什么问题 请帮忙 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

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

我试了很多次,但不明白代码有什么问题

请帮忙

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();
我的MYSQL表的结构…它有14个列…里面没有数据

$href通常应使用my for local/lexical变量定义,在这种特殊情况下,它的作用域位于while循环中

while (my $href = $sth->fetchrow_hashref ) { .. }
$href通常应使用my for local/lexical变量定义,在这种特殊情况下,它的作用域位于while循环中

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

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

您说过使用strict或使用strict vars,这表明 所有变量必须使用my或state进行词汇范围限定, 事先声明使用我们的,或明确有资格说 全局变量所在的包使用::

更新:补充了一些内容,以回答下面评论中的进一步问题

如果列可以包含空值,并且您将要打印这些列,那么您将得到未定义的值警告,除非您对此采取措施

最简单的修复方法可能是在得到哈希后立即清理它。我将在循环块的顶部使用类似以下内容将未定义的值替换为空字符串:

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

我还注意到您正在使用丑陋的$$hash_ref{key}语法。不确定是从哪里得到的,但人们普遍认为$hash_ref->{key}看起来更干净。

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

您说过使用strict或使用strict vars,这表明 所有变量必须使用my或state进行词汇范围限定, 事先声明使用我们的,或明确有资格说 全局变量所在的包使用::

更新:补充了一些内容,以回答下面评论中的进一步问题

如果列可以包含空值,并且您将要打印这些列,那么您将得到未定义的值警告,除非您对此采取措施

最简单的修复方法可能是在得到哈希后立即清理它。我将在循环块的顶部使用类似以下内容将未定义的值替换为空字符串:

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

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

在while循环中用my声明$href:while my$href=…我这样做了,并试图通过键入文件的url来运行该文件,该url包含该文件在我的web浏览器的服务器中的位置,但我得到的消息是找不到该文件!!。。。为什么会这样???在while循环中可能重复声明$href和my:while$href=…我这样做了,并试图通过键入文件的url来运行该文件,该url包含该文件在我的web浏览器的服务器中的位置,但我得到的消息是找不到该文件!!。。。为什么会这样???可能是重复的是,我做了,但现在我得到一个错误,说在串联使用未初始化的值。或者在people.cgi第37行输入字符串。i、 e在print$$href{'notes'};行中;。。。为什么会这样???某些%$href的散列值是未定义的,pragma使用警告;打印未定义值时发出警报。您可以将所有未定义的值替换为空字符串,并将值%$href;在打印之前。我已经编辑了上面的帖子,展示了表的结构。在上面的代码中需要做什么更改?如果你想避免空/未定义的值,你的“角色”和“注释”应该没有空默认值。是的,我这样做了,但现在我得到一个错误,说在串联中使用未初始化的值。或者在people.cgi第37行输入字符串。i、 e在print$$href{'notes'};行中;。。。为什么会这样???某些%$href的散列值是未定义的,pragma使用警告;打印未定义值时发出警报。您可以将所有未定义的值替换为空字符串,并将值%$href;在打印它们之前。我已经编辑了上面的帖子,显示了表的结构。在上面的代码中必须做哪些更改??如果你想避免null/undef值,你的“角色”和“注释”应该不为null默认值是的,我这样做了,添加了关键字my,并在my$href=$sth->fetchrow\u hashref{..时做了声明.现在我得到一个错误,表示在串联中使用未初始化的值。或者在people.cgi第37行输入字符串。i、 e.在print$$href{'notes'}一行。为什么???这不是一个错误,是吗
这是一个警告。表中的notes列是否允许包含空值?数据库中的空值在Perl中变为未定义。是的,它允许包含空值。我已经编辑了上面的帖子,其中显示了表的结构。在上面的代码中需要做哪些更改?更新了我的答案以回答这个问题。请注意,在评论中提出额外的问题并不是一个好主意。你应该为此发布一个新问题。是的,我这样做了,并添加了关键字my,并在my$href=$sth->fetchrow\u hashref{..}时做了声明。现在我得到一个错误,表示在串联中使用未初始化的值。或者在people.cgi第37行输入字符串。i、 e.在print$$href{'notes'}一行。为什么???这不是一个错误,这是一个警告。表中的notes列是否允许包含空值?数据库中的空值在Perl中变为未定义。是的,它允许包含空值。我已经编辑了上面的帖子,其中显示了表的结构。在上面的代码中需要做哪些更改?更新了我的答案以回答这个问题。请注意,在评论中提出额外的问题并不是一个好主意。你应该为此发布一个新问题。