【问题标题】:looping through an array of hashes in a hash循环遍历散列中的散列数组
【发布时间】:2019-01-31 23:12:38
【问题描述】:

我有以下使用哈希引用的代码:

sub readAll {
   my ( $main, $dbh ) = @_;

   my @SessSeq = ();
   my $sql;
   my $rec = 0;
   $sql  = "SELECT * FROM sys_table ";
   my $sth = PrepAndExecuteQuery( $dbh, $sql );
   while ( my $result = $sth->fetchrow_hashref() ){
      push @SessSeq, $result;
      $rec++;
   }
   $$main{_SessSeq} = \@SessSeq;
}

以上代码有效。我在主哈希中得到一个哈希数组 由于缺乏知识,我正在努力检索数据。 这似乎不起作用:

foreach my $ses ( @($$main{_SessSeq}) ){
    print STDERR Dumper $ses;
}

我做错了什么?

【问题讨论】:

  • 看起来您可能错误地取消引用哈希。试试@{$$main{_SessSeq}} 而不是@($$main{_SessSeq})
  • 这似乎不起作用是什么意思?
  • @{...} 取消引用数组引用,而不是 @(...)
  • 你是在潜艇还是在潜艇外倾倒?请记住,您填充了在 sub 中创建的 $main,但没有填充 sub 之外的任何类似命名的变量。如果您传入对数组的引用,则 sub 将添加到数组中。如果你传入undef,sub 不会修改调用者中的任何内容。
  • jja 的评论帮助了我,我现在得到了正确的会话。实际上我不想转储一些东西,当然我想访问散列数组中的散列。所以:通过我的 $hash = @{$$main{_SessSeq}}[1] ;我现在可以访问哈希。但是如果我尝试 @{$$main{_SessSeq}}[1]{name} 它会给出编译错误,因此无法识别。我怎样才能直接解决它?

标签: arrays perl hash


【解决方案1】:

假设您的foreach my $ses 循环在内部 readAll 子例程中,您唯一要做的就是在取消引用时使用括号( ... ) 而不是大括号{ ... } /p>

$$main{_SessSeq} 用现代术语写成$main->{_SessSeq} 会好得多,但两者的计算结果相同:对哈希数组的引用,每个哈希中包含来自数据库表行的数据

正确的循环应该是这样的

for my $ses ( @{ $main->{_SessSeq} } ) {
    print STDERR Dumper $ses;
}

但与只写相比没有真正的优势

print STDERR Dumper $main->{_SessSeq}

您没有说这似乎不起作用可能意味着什么,但print Dumper $ses 每次循环都会输出表格行的内容

如果您需要任何进一步的帮助,那么您必须正确描述问题,显示您获得的输出并仔细描述您的期望

【讨论】:

  • 您的回答为我提供了我遇到的问题的答案。我现在知道如何解决它
猜你喜欢
  • 1970-01-01
  • 2012-08-03
  • 2018-06-29
  • 2023-04-10
  • 2016-08-03
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2014-07-10
相关资源
最近更新 更多