【问题标题】:creating hash of hashes in perl在 perl 中创建哈希值
【发布时间】:2014-03-06 03:10:20
【问题描述】:

我有一个包含类似值的数组

my @tmp = ('db::createParamDef xy', 'data    $data1', 'model    $model1', 'db::createParamDef wl', 'data    $data2', 'model    $model2')

我想用xywl 的值创建一个哈希值

my %hash;
my @val;
for my $file(@files){
    for my $mod(@tmp){
        if($mod=~ /db::createParamDef\s(\w+)/){
        $hash{$file}="$1";
         }
         else{
            my $value = split(/^\w+\s+/, $mod);
        push (@val,$values);
         }
    $hash{$fname}{$1}="@val";
    @val=();
    }
}

这只会返回文件名和$1 的值,但我希望输出是这样的:

%hash=(
        'filename1'=>
                {
                'xy'=>'$data1,$model1',
                }
        'filename2'=>
                { 
                'wl'=>'$data2,$model2',
                }
    )

我哪里做错了?!

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    这实际上是一个非常棘手的问题。试试这样的:

    #!/bin/perl
    use strict;
    use warnings;
    
    my @tmp = ('db::createParamDef xy', 'data    $data1', 'model    $model1', 'db::createParamDef wl', 'data    $data2', 'model    $model2');
    my @files = ('filename1', 'filename2');
    
    my %hash;
    my @val;
    my $index = 0;
    my $current;
    for my $mod (@tmp) {
        if ( $mod=~ /db::createParamDef\s+(\w+)/){
            $current = $1;
            $hash{$files[$index]}={$current => ""};
            $index++;
            @val=();
        } else {
            my $value = (split(/\s+/, $mod))[1];
            push (@val,$value);
        }
        $hash{$files[$index - 1]}{$current} = join(",", @val);
    }
    
    
    use Data::Dumper;
    print Dumper \%hash;
    

    如果您对它的工作原理有任何疑问,请告诉我!

    【讨论】:

      【解决方案2】:
      my @tmp = (
        'db::createParamDef xy', 'data    $data1', 'model    $model1', 
        'db::createParamDef wl', 'data    $data2', 'model    $model2'
      );
      
      my $count = 0;
      my %hash = map {
        my %r;      
        if (my($m) = $tmp[$_] =~ /db::createParamDef\s(\w+)/) {
      
          my $i = $_;
          my @vals = map { $tmp[$i+$_] =~ /(\S+)$/ } 1..2;
          $r{"filename". ++$count}{$m} = join ",", @vals;          
        }
        %r;
      } 0 .. $#tmp;
      
      use Data::Dumper; print Dumper \%hash;
      

      输出

      $VAR1 = {
                'filename1' => {
                                 'xy' => '$data1,$model1'
                               },
                'filename2' => {
                                 'wl' => '$data2,$model2'
                               }
              };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 2011-04-20
        • 2011-05-08
        • 2011-02-23
        • 2014-05-06
        相关资源
        最近更新 更多