【问题标题】:Replace hashes of hash with another hashes of hash将散列的散列替换为散列的另一个散列
【发布时间】:2016-09-04 22:23:41
【问题描述】:

我有两个从两个单独的 tex 文件创建的哈希值。我想用散列的第一个散列更改散列的第二个散列的值,并希望将其写入第三个文件。或者我可以自己替换第二个文本文件中的值。

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

哈希1:

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 的哈希中的方式相同。

有什么建议可以替换这个值吗? 我尝试在第二个文件中替换,但没有成功。

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

我认为不是替换,而是将 file2 写在第三个文件中,并且只有第一个文件中的值才会反映在第三个文件中。

【问题讨论】:

  • 你的 RegEx 发生了什么?您是否获得了正确的值(例如通过print)?
  • 是的。我在哈希的两个哈希中都得到了正确的值

标签: perl hash replace key


【解决方案1】:

您已经说过您使用 RegEx 获得了正确的值,所以只需将它们写回文件:

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;

一旦传递了最顶层的数据结构,就会调用 sub,并在获得 $data 的 HashRef 时调用自身。

【讨论】:

  • 这只会按原样写入哈希值。我想从 file1 替换 file2 的值。我有两个这样的哈希值。这将只打印存储在散列散列中的值,而不是存储在散列散列中的行被打印。我尝试了这个逻辑..我一直打印 file2,因为它在 file3 中,直到我找到这些值。当我找到该值时,它将在哈希的第一个哈希中搜索相关值并将其打印在 file3 中。
猜你喜欢
  • 2013-05-16
  • 2023-03-07
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多