【问题标题】:Where is my associative array and how do I access it using Perl DBI?我的关联数组在哪里,如何使用 Perl DBI 访问它?
【发布时间】:2011-03-05 13:55:42
【问题描述】:

我正在使用 perl,并使用 DBI。到目前为止,我一直在使用 ->fetchall_arrayref 来获取数据库查询的结果,并且只是通过数字键访问数组。但是,我更喜欢能够通过字段名称(关联提取)而不是数字来访问记录。

我该怎么做,访问密钥的正确语法是什么?

我更喜欢这样的:

$data[0]['name']

代替:

$data[0][1]

工作解决方案

my %data;
@{$data{$id}}{('name')} = 'something';

【问题讨论】:

    标签: perl syntax dbi


    【解决方案1】:

    阅读DBI docs。特别是fetchall_hashref。

    你还应该学习 Perl 语法,因为它与 PHP 不同。

    【讨论】:

    • 我正在寻找具体的帮助,谢谢,而不是 RTFM 答案。我看了看,但没有多大意义。我知道 perl != PHP
    • 如果结果集的大小未知,在while 循环中使用fetchrow_hashref 会更安全。此外,假设明智地避免使用 SELECT * FROM 并将查询限制为仅感兴趣的列,则使用 fetchrow_arrayref 并分配给少量局部变量会更有效。
    • DBI 文档非常庞大,但至少略读一下确实是有益的,因此您知道存在哪些功能。
    • @Sinan -- 你说得对, fetchall_* 不是处理大型数据集的最佳方法......我做了一个(可能很糟糕)假设,如果他使用的是 fetchall_arrayref,那么 fetchall_hashref 是他正在寻找的变化(并且会满足他要求的结构)。
    • 您的回答是正确的,并且在原始问题的上下文中是正确的。我只是提供一些补充信息。
    【解决方案2】:

    如果你使用fetchall_hashref(),那么你会得到你正在寻找的哈希值。键将是数据库中的字段名称。我有点晚了,乔明白了,但会的。

    $data->{0}->{'field'};
    

    【讨论】:

    • 感谢您提供的好例子。我阅读的手册信息现在更有意义了。
    • @Ben 当您消除噪音时,这个答案归结为说明与@Joe 所做的相同的信息(没有指向文档的链接)和单行代码$data->{0}->{'field'} 仍然无法解释因此是一个坏的例子。例如,什么是0?我知道它是什么,但你知道吗?由于您似乎不喜欢阅读文档,因此我将冒险并假设您不喜欢。
    • @Sinan 你可能想对 Ben 放轻松一点,他说他查看了文档但无法理解。我只是把他那行 php 风格的代码改成 perl 风格。我想因为他有 0 他知道上下文。如果没有达到您的期望,我很抱歉。
    • 您可以稍微简化您的答案:$data->{0}{field};。这是因为第二个箭头不是必需的,在第一个 [] 或 {} 之后,取消引用是隐式的。此外,当哈希键是单个单词时,它们会被引用。
    【解决方案3】:

    您可以为此使用 selectall_arrayref。以下是 DBI 手册页中的示例:

    您可能经常想要获取一个行数组,其中每一行都存储为一个哈希值。 这可以很简单地使用:

      my $emps = $dbh->selectall_arrayref(
          "SELECT ename FROM emp ORDER BY ename",
          { Slice => {} }
      );
      foreach my $emp ( @$emps ) {
          print "Employee: $emp->{ename}\n";
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多