加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

传递给子例程时Perl引用和引用哈希值?

发布时间:2020-12-15 23:33:40 所属栏目:大数据 来源:网络整理
导读:我现在已经在这个问题上敲了大约5个小时,我真的很沮丧,需要一些帮助. 我正在编写一个Perl脚本,用于从MySQL表中提取作业,然后执行各种数据库管理任务.当前的任务是“创建数据库”.该脚本成功创建了数据库,但是当我为PHP开发人员生成配置文件时,它就会爆炸. 我
我现在已经在这个问题上敲了大约5个小时,我真的很沮丧,需要一些帮助.

我正在编写一个Perl脚本,用于从MySQL表中提取作业,然后执行各种数据库管理任务.当前的任务是“创建数据库”.该脚本成功创建了数据库,但是当我为PHP开发人员生成配置文件时,它就会爆炸.

我认为引用和解引用变量是一个问题,但我不确定到底发生了什么.我想在这个函数调用之后,会发生一些事情
$$结果{ ‘的databaseName’}.这就是我得到结果的方式:$result = $select-> fetchrow_hashref()

这是我的函数调用,以及函数实现:

函数调用(第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时,您将通过值传递,而不是通过引用传递.这可以.
>你得到一个undef警告,这意味着你正在使用’use strict;’.好!
>通过我的函数在函数中创建词法$结果.
>虽然$$hashr {key}是有效代码,但$hashr-> {key}是首选.
>您正在使用dbh-> prepare,也可以使用占位符.

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;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读