Perl 创建散列时未获取输出

Perl 创建散列时未获取输出,perl,Perl,我正在尝试生成散列。我从一个txt文件中读取输入,并将数据转换成散列。txt文件的格式为 flintstones : lead=fred pal=barney jetsons : lead=george wife=jane "his boy"=elroy simpsons : lead=homer wife=marge kid=bart 哈希格式的哈希如下所示 %HoH = ( flintstones => { lead => "fred", pa

我正在尝试生成散列。我从一个txt文件中读取输入,并将数据转换成散列。txt文件的格式为

flintstones : lead=fred pal=barney
jetsons : lead=george wife=jane "his boy"=elroy
simpsons : lead=homer wife=marge kid=bart
哈希格式的哈希如下所示

%HoH = (
    flintstones => {
    lead      => "fred",
    pal       => "barney",
    },
    jetsons     => {
    lead      => "george",
    wife      => "jane",
    "his boy" => "elroy",
    },
    simpsons    => {
    lead      => "homer",
    wife      => "marge",
    kid       => "bart",
},
 );
我写的代码是

use strict;
use warnings;

my %hash = ();
my $hash1 = {};
open (FH, "2.txt") or die "file not found";
while (<FH>) {
my @array = split (":", $_);
$array[0] =~ s/^\s*//;
$array[0] =~ s/\s*$//;
$array[1] =~ s/^\s*//;
$array[1] =~ s/\s*$//;
my @array1 = split (" ", $array[1]);
for (0..$#array1) {
    my ($key, $value) = split ("=", $array1[$_]);
    $hash{$array[0]}{$key} = $value;
    #$hash1->{$key} = $value;
    #print "    $hash1{$key} \n";
}
#$hash{$array[0]} = $%hash1;

}
close FH;
print " value is %hash" ;
使用严格;
使用警告;
我的%hash=();
我的$hash1={};
打开(FH,“2.txt”)或死“未找到文件”;
而(){
my@array=split(“:”,$);
$array[0]=~s/^\s*/;
$array[0]=~s/\s*$/;
$array[1]=~s/^\s*/;
$array[1]=~s/\s*$/;
my@array1=split(“,$array[1]);
对于(0..$#阵列1){
my($key,$value)=拆分(“=”,$array1[$\);
$hash{$array[0]}{$key}=$value;
#$hash1->{$key}=$value;
#打印“$hash1{$key}\n”;
}
#$hash{$array[0]}=$%hash1;
}
关闭FH;
打印“值为%hash”;
没有得到输出。我的代码有什么问题

请严格使用;
use strict;
use warnings;

# match chars or chars inside '"' following by '=' and chars for hash value
my $re = qr/(?: (\w+) | "(.+?)" ) = (\w+)/x;
my %hash;

open (FH, "<", "2.txt") or die $!;
while (<FH>) {
  my ($k, $s) = split /\s*:\s*/, $_, 2;
  my %hash1 = grep defined, $s =~ /$re/g;
  $hash{$k} = \%hash1;
}
close FH;

use Data::Dumper;
print "value is ", Dumper \%hash;
使用警告; #匹配“=”后面的字符或“'”内的字符,以及哈希值的字符 我的$re=qr/(?:(\w+)|“(.+?)”)=(\w+)/x; 我的%hash; 开放(FH),
严格使用;
使用警告;
#匹配“=”后面的字符或“'”内的字符,以及哈希值的字符
我的$re=qr/(?:(\w+)|“(.+?)”)=(\w+)/x;
我的%hash;

open(FH,“您使用数组索引循环,然后尝试拆分索引而不是数组元素。您能以代码格式告诉我吗?我将在“:”之后拆分行。然后我留下“lead=fred pal=barney”。使用空格拆分,然后使用“=”
拆分(0…$#数组1)…拆分(=”,$)
。不过,这并不是你的代码的全部错误。你只拆分一次而不使用模式,拆分一次并丢弃结果。你不考虑键中带引号的空格,这会导致散列元素的奇数。@Nitesh你需要使用
use Data::Dumper;print Dumper(\%hash);
打印数据correctly@Nitesh您可能会考虑使用
Text::ParseWords
模块来处理带引号的空白。您可以使用数组索引循环,然后尝试拆分索引而不是数组元素。您可以用代码格式告诉我吗。我将在“:”之后拆分行。然后我将剩下“lead=fred pal=barney”.使用空格拆分,然后使用“=”
拆分(0…$#array1)…拆分(“=”,$)
。不过,这并不是你的代码的全部错误。你只拆分一次而不使用模式,拆分一次并丢弃结果。你不考虑键中带引号的空格,这会导致散列元素的奇数。@Nitesh你需要使用
use Data::Dumper;print Dumper(\%hash);
打印数据correctly@Nitesh您可以考虑使用
Text::ParseWords
模块来处理带引号的空白。