Поскольку ни один из двух блоков не может иметь одинаковое значение name
, вы можете использовать ссылку на хэш ссылок на хэш:
{
"name1"=>{type=>"type1",id=>"id1",owner=>"owner1",path=>"path1"},
"name2"=>{type=>"type2",id=>"id2",owner=>"owner2",path=>"path2"},
#etc
}
Что-то вроде этого должно работать (Предупреждение: не проверено):
use strict;
use warnings;
open(my $read,"<","input_file.txt") or die $!;
my $data={};
my $current_name=""; #Placeholder for the name that we're currently using.
while(<$read>)
{
chomp; #get rid of trailing newline character.
if(/^\s*name:\s*([\w]+)\s*$/) #If we hit a line specifying a name,
#then this is the name we're working with
{
$current_name=$1;
}
elsif(/^\s*(type|id|owner|path):\s*([\w]+)\s*$/) #If it's data to go with the name,
#then assign it.
{
$data->{$current_name}->{$1}=$2;
}
}
close($read);
#Now you can search your given array for each of the names and do what you want from there.
Однако, если вы можете, я действительно рекомендую хранить данные в вашем файле в каком-то стандартизированном формате (YAML, INI, JSON, XML и т. Д.), А затем анализировать их соответствующим образом.Я также должен добавить, что этот код зависит от каждого name
, появляющегося перед соответствующими type
, id
, owner
и path
.