Regex Perl';或';条件获取同一密钥中的哈希值

Regex Perl';或';条件获取同一密钥中的哈希值,regex,perl,hash,Regex,Perl,Hash,我有一个文件,其中包含古吉拉特邦、西孟加拉邦、查谟和克什米尔和D&D哈维利等州的格式。我写了一个正则表达式来得到这样的名字。这些名称进入“年”(2001)的键中,这样它也可以从正则表达式中获得,因此年是键,不同的州是同一键的一部分 my $stat; my ($line, $year, $state_name, @state_name); while($line = <FH>){ if($line =~ m/^Year (\d+)\S+/){ $yea

我有一个文件,其中包含古吉拉特邦、西孟加拉邦、查谟和克什米尔和D&D哈维利等州的格式。我写了一个正则表达式来得到这样的名字。这些名称进入“年”(2001)的键中,这样它也可以从正则表达式中获得,因此年是键,不同的州是同一键的一部分

my $stat;
my ($line, $year, $state_name, @state_name);
while($line = <FH>){
    if($line =~ m/^Year (\d+)\S+/){
            $year = $1;
            $stat->{$year} = {};
            next;
    }
    elsif ($line =~ m/^State:,(\w+\s\w+)/){
            $state_name = $1;
            $stat->{$year}{$state_name} = {};
            next;
    }
    elsif ($line =~ m/^State:(\w+)/){
           $state_name = $1;
           $stat->{$year}{$state_name} = {};
           next;
    }
    elsif ($line =~ m/^State:(\w&\w\s\w+)/){
           $state_name = $1;
           $stat->{$year}{$state_name} = {};
           next;
    }
    elsif ($line =~ m/^State:(\w+\s&\s\w+)/){
           $state_name = $1;
           $stat->{$year}{$state_name} = {};
           next;
    }
  }
  print (Dumper(\$stat));
取而代之的是,只有西孟加拉邦在散列中以键as 2001打印,其他的被省略。你能告诉我哪里出了问题吗。多谢各位

编辑的文件如下所示:

Year 2001,,,,,,,,
State:,West Bengal,,,,,,,
Year 2001,,,,,,,,
State:,Gujarat,,,,,,,
Year 2001,,,,,,,,
State:,Jammu & Kashmir,,,,,,, and so on.
守则:

if($line =~ m/^Year (\d+)\S+/){
            $year = $1;
            $stat->{$year} = {};
            next;
    }
将覆盖
$stat->{$year}
下的结构(如果存在),因为“2001”年份值出现多次

快速修复:

if($line =~ m/^Year (\d+)\S+/){
            $year = $1;
            if (not defined $stat->{$year}) { 
             $stat->{$year} = {};
            }
            next;
    }

您确定
年份
总是显示在其他项目之前吗?如果
Year
延迟显示,它将不会设置
$Year
您可以将输入文件作为示例提供给您的帖子吗?看来找到你的错误很重要,请看编辑部分。。谢谢你的快速回复州名如何?为什么只显示一个名称?请你调查一下。谢谢你误解了我的修正,它们并没有像你说的那样被覆盖,相反,你正在丢失它,因为你文件中的“Year”指令正在用一个新的哈希替换现有的哈希,这很糟糕。我的修复阻止了这种替换。
if($line =~ m/^Year (\d+)\S+/){
            $year = $1;
            if (not defined $stat->{$year}) { 
             $stat->{$year} = {};
            }
            next;
    }