G'day Nansh,
I'd consider using a hash.
Use the makes for the main keys;
you can always generate an array of them with keys if needed.
You didn't explain what the lines starting with "*." were supposed to be.
I've assumed some sort of comment and labelled them as such.
You didn't explain why some models start with a "+": I've put them in separate arrays.
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dump;
my %cars;
my $models_re = qr{(?x: ^ ( \w+ ) \s+ ( [^*]+? ) \s+ [*][.] ( .*? ) \s
+* $ )};
my $plus_re = qr{(?x: ^ [+] ( .* ) $ )};
{
local $/ = 'CARS ';
while (<DATA>) {
chomp;
next unless length;
my ($make, $models, $comment) = /$models_re/;
for (split /\s+/, $models) {
if (/$plus_re/) {
push @{$cars{$make}{models}{plus}}, $1;
}
else {
push @{$cars{$make}{models}{plain}}, $_;
}
}
$cars{$make}{comment} = $comment;
}
}
dd \%cars;
__DATA__
CARS TOYOTO Etios Innova Camry
+Fortuner Corolla
*.This is Class cars.
CARS HYUNDAI Verna i10 i20
+Eon Xcent
+Tucson
*.It is best cars.
CARS HONDA City Brio Amaze
+Accord
*.This is Luxury cars.
Output:
{
HONDA => {
comment => "This is Luxury cars.",
models => { plain => ["City", "Brio", "Amaze"], plus =
+> ["Accord"] },
},
HYUNDAI => {
comment => "It is best cars.",
models => {
plain => ["Verna", "i10", "i20", "Xcent"],
plus => ["Eon", "Tucson"],
},
},
TOYOTO => {
comment => "This is Class cars.",
models => {
plain => ["Etios", "Innova", "Camry", "Cor
+olla"],
plus => ["Fortuner"],
},
},
}