2016-05-04 40 views
1

嗨,我是新的perl,我坚持一个问题。我正在创建哈希散列,因为我想存储几行作为值。我只在价值上唱歌。如何存储散列值散列中的几行

FILE.TXT

family(){ 
kapoor(){ 
member1(){ 
male(){ 
between : 0 to 5 
person : 2 
their name is bla & bla. 
and bla bla...... 
blaa..... 
} 

male(){ 
between : 5 to 5 
person : 20 
their name is bla & bla bla. 
and bla bla...... 
blaa..... 
} 
} 

member2(){ 
male(){ 
between : 0 to 5 
person : 2 
their name is bla & bla. 
and bla bla...... 
blaa..... 
} 

male(){ 
between : 5 to 5 
person : 20 
their name is bla & bla bla. 
and bla bla...... 
blaa..... 
} 
} 
} 


rai(){ 
member1(){ 
male(){ 
between : 0 to 5 
person : 2 
their name is bla & bla. 
and bla bla...... 
blaa..... 
} 

male(){ 
between : 5 to 5 
person : 20 
their name is bla & bla bla. 
and bla bla...... 
blaa..... 
} 
} 

member2(){ 
male(){ 
between : 0 to 5 
person : 2 
their name is bla & bla. 
and bla bla...... 
blaa..... 
} 

male(){ 
between : 5 to 5 
person : 20 
their name is bla & bla bla. 
and bla bla...... 
blaa..... 
} 
} 
} 

O/P应该是:

family=>{ 

    kapoor => { 
       member1=>{ 
          0 to 5=> person : 2 
            their name is bla & bla. 
            and bla bla...... 
            blaa..... 

          } 
       member2=> { 
          5 to 5 => person : 20 
            their name is bla & bla bla. 
            and bla bla...... 
            blaa..... 

       } 

rai =>{ 
/...................etc 
} 

我得到的值只有一行,像

family=>{ 

    kapoor => { 
       member1=>{ 
          0 to 5=> person : 2 
                    } 
       member2=> { 
          5 to 5 => person : 20 

       } 

rai =>{ 
/...................etc 
} 

这里是我的尝试:

while(my$line=<$fh>) 
    { 

    if($line=~/$family_name_re/) 
    { 
     $family_name=$1; 
    $family_count=$cell_count+1; 
    } 
    elsif ($line=~/$member_re/) 
    { 
    $member = $1; 
} 
    elsif ($line=~/$age_re/) 
{ 
    $age_range=$1; 

    $data{$family_name}{$member}{$age_range}=$line; 
    } 
} 
    print Dumper(\%data); 
    print "Number of cell is $cell_count\n"; 

close ($fh); 

我不知道如何分配多个行来创建值。我在分配价值的同时尝试,但没有奏效。

+1

(3或任何数量的线,你需要)..像'$一号线= <$fh>','$ 2号线= <$fh>'等并在分配之前将它们与'$ line'连接起来 – Sundeep

+1

您的输入文件非常混乱:嵌套看起来不正确(member1是两个男性)并且您忽略了男性分组。此外你的代码是不完整的,因为你不给我们正在使用的正则表达式。正如@spasic所说的,你应该在某个时候读取更多的行,因为目前你只能以行为单位读取/存储文件中的数据。这是目前的核心问题。 – eballes

+0

ebailes说,文件格式及其解析没有多大意义。你的散列分配看起来很好,但是(除了不清楚'$ line'实际上是什么)。以正确格式向我们显示文件和正则表达式。 – zdim

回答

1

看起来你想要%数据是一个HoHoHoHoH,而你只有一个HoHoHoH。 例如你想

$data{$family_name}{$member}{$age_range}= {5 to 5 => person : 20, 
           their name => bla & bla bla, 
           bla => bla bla, 
           ... 
           } 

为了使这项工作,你可能要清理你的导入代码, 尤其是固定线路

$data{$family_name}{$member}{$age_range}=$line; 

这仅仅是一个HoHoHoH,这就是为什么你输出只有一行 ,而不是你想要的散列。

因此,通过伪码S/B类似

$data{$family_name}{$member}{$age_range}=%lines; 

希望有所帮助。

0

我找到了答案:

推@ {$数据{$ FAMILY_NAME} {$成员} {$ AGE_RANGE}},$线;

:)在过去`elsif`,就可以得到下一行