2016-05-10 29 views
0

2つの別々のtexファイルから作成したハッシュのハッシュが2つあります。ハッシュの最初のハッシュでハッシュの2番目のハッシュ値を変更し、3番目のファイルに書きたいと思っています。または私はそれを自分自身の2番目のテキストファイルに置き換えることができます。ハッシュのハッシュを別のハッシュのハッシュに置き換えます。

ファイル1:

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..... 
} 
} 
} 

HASH1:

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 
} 

ハッシュ2は同じであるが、値が異なっています。

は、私が試した:

while(my$line=<$fh>) ******** to store hashes of hash from file 1*** 
    { 

    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; 

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

close ($fh); 

と同じように私は2番目のファイルからの読み取りと

私は値を置き換えることができますどのように任意の提案ハッシュ2のハッシュに格納するのですか? 2番目のファイルに置き換えようとしましたが、動作しませんでした。

$_=~s/$newvalue/$data{$family_name}{$member}{$age_range}/; 

の代わりに置き換えて、私はそれは3番目のファイルのみ値であるように、第3のファイルに反映されます最初のファイルからFILE2書くことだと思います。

+0

RegExには何が起こったのですか?あなたは正しい値を得ましたか(例えば 'print'を介して)? – Sebastian

+0

はい。私はハッシュの両方のハッシュで正しい値を得ています。 – Raj

答えて

0

あなたはすでにあなたは正規表現を使用して、正しい値を取得することを、これだけ戻ってファイルに書き込む言った:ファイルにすべてを印刷する構造のすべてのレベルを介して

open my $fh3,'>','file3.txt'; 
print $fh3 "family(){\n"; 
for my $family (keys %data) { 
    print $fh3 "$family() {\n"; 
    for my $member (keys %{$data{$family_name}}) { 
     print $fh3 "$member() {\n"; 
     for my $age_range (keys %{$data{$family_name}}) { 
      print $fh3 "$age_range() {\n". 
        join(
         "\n", 
         @{$data{family_name}->{$member}->{$age_range}->{values}} 
       ). 
        "}\n"; 
     } 
     print $fh3 "}\n"; 
    } 
    print $fh3 "}\n"; 
} 
print $fh3 "}\n"; 

ループ。

別の試み:

sub write_part { 
    my $fh = shift; 
    my $data = shift; 

    if (ref($data) eq 'HASH') { 
     for my $key (keys %$data) { 
      print $fh "$key() {\n"; 
      write_part($fh, $data->{$key}); 
      print $fh "}\n"; 
     } 
    } elsif (ref($data) eq 'ARRAY') { 
     print $fh join("\n", @$data)."\n"; 
    } else { 
     print $fh $data."\n"; 
    } 
} 

open my $fh3, '>', 'file3.txt'; 
write_part($fh3, \%data); 
close $fh3; 

サブは、一度最上位のデータ構造を渡すと呼ばれ、それが$dataとしてハッシュリファレンスを取得するたびに自分自身を呼び出しています。

+1

これはハッシュのハッシュをそのまま書きます。私はfile1からfile2の値を置き換えたいです。私はハッシュの2つのそのようなハッシュを持っています。これはハッシュのハッシュに格納されている値だけを出力し、ハッシュのハッシュに格納されている以外の行は出力しません。私はこの論理を試しました。私は値が見つかるまで、file2をfile3のままにしておきます。値を見つけたら、ハッシュの最初のハッシュで関連する値を検索し、それをfile3に出力します。 – Raj

関連する問題