在perl中创建哈希哈希

时间:2014-03-05 17:28:55

标签: arrays perl hash

我有一个包含值

的数组
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',
                }
    )

我在哪里做错了?!

2 个答案:

答案 0 :(得分: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;

如果您对其运作方式有任何疑问,请与我们联系!

答案 1 :(得分:1)

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'
                         }
        };
相关问题