【问题标题】:How can I insert hash values in columns with Perl's DBI?如何使用 Perl 的 DBI 在列中插入哈希值?
【发布时间】:2009-12-02 02:38:54
【问题描述】:

我有一个哈希值,我正在尝试将其值插入数据库。哈希定义如下:

my %hash = (
            1   =>  'First Word',
            2   =>  'Second Word is correct',
            0   =>  'Third word does not exist',
            );

我不知道如何使用散列在数据库中插入值。我注意到我的问题类似于this 问题。但是,似乎没有一个答案是正确的。在使用任何列出的答案时,不会插入散列中的值,而是插入对散列的引用,即ARRAY(0x9e63b30)。但是当我print Dumper @values 时,会打印值而不是参考值。

关于如何插入值而不是它们的引用有什么建议吗?而且,question 的答案中列出的解决方案出了什么问题。

@values 的定义与this question 相同,即

my @values = values %hash;

编辑: 数据库结构:

T1:

sid  sentence
1    First Word
2    Second Word is correct
0    Third word does not exist

上面的sid是hash的keys,句子是hash的values

这是我尝试过的(这是question的答案之一):

my @keys = keys %hash;

my @values = values %hash;

my $sth = $dbh->prepare("INSERT INTO T1(sid, sentence) VALUES (?,?);");

$sth->execute_array({},\@keys, \@values);

再次,在插入 @values 时,参考值被插入。

编辑:

_ 输出 _

$VAR1 = 'First Word';
$VAR2 = 'Third word does not exist';
$VAR3 = 'Second Word is correct';

_ 代码 _ 这就是我将值插入 %hash

的方式
my $x=0;
foreach my $file(@files){
        if ($file =~ /regex/){
                push(@{$hash{$x}}, "$1 $2 $3 $4 $5 $6 $7"); 
        }
        elsif ($file =~ /regex/){
                push(@{$hash{$x}}, "$1 $2 $3 $4 $5 $6");
        }
        elseif ($file =~ /Hs_(.+)_(.+)_(.+)_(.+)_(.+)_W.+txt/){
                push (@{$hash{$x}}, "$1 $2 $3 $4 $5");
        }
$x++;
}

【问题讨论】:

  • 该问题的所有答案都是正确的。您真的需要帮助更新数据库还是需要帮助使用 Perl 标准数据结构?
  • @Manni:如果答案是正确的,为什么参考值会上传到数据库而不是实际值?
  • 给我们看一些代码:至少是sql语句和execute语句。然后告诉我们您的数据库。我们现在知道您希望这些值如何在您的数据库中结束。键是表示行、列还是都不表示?
  • 显示print Dumper \@values的输出
  • 我们可以看到更多你的代码吗?听起来某处有一个简单的错误,特别是因为您显然已经尝试了三种不同的有效方法。简单的打字错误有时让我很困惑。

标签: perl dbi


【解决方案1】:

这不是您最初发布的内容!!!您有一个对数组的引用哈希。阅读 perl 参考教程 (perlreftut) 以了解它们。

(使用命令

perldoc perlreftut

访问本教程)

【讨论】:

    【解决方案2】:

    这应该可行。

    my $key;
    my $value;
    while (($key, $value) = each %hash) {
        $sth->bind_param(1, $key);
        $sth->bind_param(2, $value);
        $sth->execute();
    }
    

    【讨论】:

    • 最好把循环写成while( my ( $key, $value ) = each %hash )
    • 没有仍然上传参考而不是实际值。
    • 在循环中打印出$key和$value,看看hash中获取的值是否正确。
    • 另请注意,我使用的是执行而不是执行数组
    • $key 是正确的,但 $value 被打印为参考值,即 ARRAY(0x949f6b0)。出了什么问题?
    【解决方案3】:

    更新:

    我建议您从前面的thread 中获取一个功能示例,并让它在您的计算机上与您的数据库一起工作。一旦您可以使这些示例之一正常工作,那么您应该能够修复自己的代码。


    上一个答案:

    我对另一个使用execute_array()thread 的回复也有效,我在发布之前对其进行了测试。

    【讨论】:

    • 它有效,但正如我所提到的,它上传参考值而不是实际值。
    • 我添加了更多代码部分。添加了我如何创建 %hash
    猜你喜欢
    • 2011-11-22
    • 2013-08-26
    • 2014-04-13
    • 2019-06-04
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2010-12-09
    • 2021-12-30
    相关资源
    最近更新 更多