传递给子例程时Perl引用和引用哈希值?
我现在已经在这个问题上敲了大约5个小时,我真的很沮丧,需要一些帮助.
我正在编写一个Perl脚本,用于从MySQL表中提取作业,然后执行各种数据库管理任务.当前的任务是“创建数据库”.该脚本成功创建了数据库,但是当我为PHP开发人员生成配置文件时,它就会爆炸. 我认为引用和解引用变量是一个问题,但我不确定到底发生了什么.我想在这个函数调用之后,会发生一些事情 这是我的函数调用,以及函数实现: 函数调用(第127行): generateConfig($$result{'databaseName'},$newPassword,"php"); 功能实现: sub generateConfig { my($inName) = $_[0]; my($inPass) = $_[1]; my($inExt) = $_[2]; my($goodData) = 1; my($select) = $dbh->prepare("SELECT id FROM $databasesTableName WHERE name = '$inName'"); my($path) = $documentRoot.$inName."_config.".$inExt; $select->execute(); if ($select->rows < 1 ) { $goodData = 0; } while ( $result = $select->fetchrow_hashref() ) { my($insert) = $dbh->do("INSERT INTO $configTableName(databaseId,username,password,path)". "VALUES('$$result{'id'}','$inName','$inPass','$path')"); } return 1; } 错误: Use of uninitialized value in concatenation (.) or string at ./dbcreator.pl line 142. Use of uninitialized value in concatenation (.) or string at ./dbcreator.pl line 154. 第142行: $update = $dbh->do("UPDATE ${tablename} SET ${jobStatus}='${newStatus}' WHERE id = '$$result{'id'}'"); 第154行: print "Successfully created $$result{'databaseName'}n"; 我认为问题来自函数调用的原因是因为如果我注释掉函数调用,一切都很好! 如果有人能帮我理解发生了什么,那就太好了. 谢谢, 附:如果您发现整个存储密码的安全性问题是数据库中的纯文本,那么在正常工作之后将会解决这个问题. = P 迪伦 解决方法
您不希望存储对fetchrow_hashref返回的$result的引用,因为每次后续调用都将覆盖该引用.
没关系,当你调用generate_config时,你没有使用引用,因为你是按值传递数据. 你在generate_config和调用函数中使用相同的$result变量吗?你应该在generate_config中使用自己的’my $result’. while ( my $result = $select->fetchrow_hashref() ) # ^^ #add my 这就是您所包含的当前代码片段所能说的全部内容. 一些清理: >调用generate_config时,您将通过值传递,而不是通过引用传递.这可以. sub generateConfig { my($inName,inPass,$inExt) = @_; my $goodData = 1; my $select = $dbh->prepare("SELECT id FROM $databasesTableName WHERE name = ?"); my $insert = $dbh->prepare(" INSERT INTO $configTableName( databaseID,path) VALUES( ?,?,?)" ); my $path = $documentRoot . $inName . "_config." . $inExt; $select->execute( $inName ); if ($select->rows < 1 ) { $goodData = 0; } while ( my $result = $select->fetchrow_hashref() ) { insert->execute( $result->{id},$inName,$inPass,$path ); } return 1; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |