【问题标题】:dereferencing a multi-tiered hash in Perl在 Perl 中取消引用多层哈希
【发布时间】:2014-07-31 22:26:17
【问题描述】:

我无法取消引用 %spec_hash 是多级哈希吗?

#!/perl/bin/perl
use FOOConf; #custom module 
use Data::Dumper ;
FOOConf::makeDBConnection(production);
use strict; 
use warnings; 

my $dbh=$EVTConf::dbh;
my $query = "select e_risk_symbol from gsd_etds where level_name='EXCH_CS' and e_exch_dest='XISX' and e_symbol_comment in ('Bin_6','Bin_56')";

if(!$dbh) {
    print "Error connecting to DataBase; $DBI::errstr\n";
    }  
    my $cur_msg = $dbh->prepare($query) or die "\n\nCould not prepare statement:".$dbh->errstr;
    $cur_msg->execute();
    while (my @row=$cur_msg->fetchrow_array) {
           $spec_hash{'XISX'}{$row[0]}=1;
           }

    while(($key,$value) = each(%spech_hash)) {
        print $key. "," .$value ;
        }

我可以看到散列的内容:

#!/perl/bin/perl
use strict; 
use warnings ; 
use FOOConf; # custom module we use for db access. 
FOOConf::makeDBConnection(production); # amkes a database connection. 
my $dbh=$EVTConf::dbh;
my $query = "select e_risk_symbol from gsd_etds where level_name='EXCH_CS' and e_exch_dest='XISX' and e_symbol_comment in ('Bin_6','Bin_56')";

if(!$dbh) {
    print "Error connecting to DataBase; $DBI::errstr\n";
    }
    my $cur_msg = $dbh->prepare($query) or die "\n\nCould not prepare statement:".$dbh->errstr;
    $cur_msg->execute();
    while (my @row=$cur_msg->fetchrow_array) {
          foreach $row(@row) {
          print "$row ";
          }
    }

     print "\n";

这就是我得到的;

MTG GPS WM JBL ISIL MBI BA ILMN FCEL NDAQ CMS HOLX
INTC CYBX STLD MDT CTSH ASBC AMP KLAC LXK X MON 
SYY HIG UNM AMGN STZ KMP SONC ECA BEBE EAT PLCE 
SPN LAMR PDCO XLP GME CSGP EXC BHP

我可以通过浏览 @row 数组,我可以转储 %spec_hash

    while (my @row=$cur_msg->fetchrow_array) {
           $spec_hash{'XISX'}{$row[0]}=1;
           }

           print Dumper(%spec_hash)

在转储中是 XISX 哈希的名称,FCEL 是哈希 XISX 中的键,键 FCEL 的值为 1

foo@fooserver:/tmp/walt $ ./just_db.row.dumper
$VAR1 = 'XISX';
$VAR2 = {
          'FCEL' => 1,
          'GPS' => 1,  
          'MCO' => 1,
          'DPZ' => 1,
          'WM' => 1,
          'SPLS' => 1,
          'ILMN' => 1,
          'BWLD' => 1,
          'CTSH' => 1,
          'EWU' => 1,
          'MDVN' => 1,
          'PDCO' => 1,
          'AFAM' => 1,
          'SHW' => 1,

我就是无法取消引用

 "$spec_hash{'XISX'}{$row[0]}=1;" 

关于这个哈希的加载方式,我有些不明白。

【问题讨论】:

  • 它更容易阅读 - %spec_hash 之前的 \ 做了什么?

标签: perl hash


【解决方案1】:

执行此转储以查看更好的哈希结构:

print Dumper(\%spec_hash);

要取消引用,您需要:

 while(my($key,$value) = each(%{$spech_hash{'XISX'}})) {

【讨论】:

  • 这是什么哈希值?
  • hash的名字是不是%spec_hash{'XISX'} hash的key是符号,比如FCEL、SPLS等,每个key的值都是1?
  • 这是一个散列的多级散列 - 命名恶魔将有助于我理解它
  • 这是一个多维散列。它是散列的散列。
  • 因此它必须被取消引用。所以是的,当您取消引用时,当您获得 $spec_hash{'XISX'} 的值时,您最终会得到哈希引用。所以你需要取消引用
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 2018-02-25
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多