Punit Jain,

This is not the optimized code but you can refactor it. This works for the 
given scenario, no matter the order of input data.

Hope it helps to some extent.

[code]
my $var = '';
my @args = ();
my %hash;

while (<DATA>) {
chomp;
my ($var,$arg) = split /=/,$_,2;
if($var eq '{') {
@args = (); #Reset if we encounter '{'
}
my @arg1 = split /,/,$arg if defined $arg;
if(scalar @arg1 > scalar @args) {
            $hash{$var} = $arg unless($var eq '{' || $var eq '}');
            @args = @arg1;
}
}

foreach my $k (sort keys %hash) {
print "$k = $hash{$k}\n";
}

__DATA__
{
test = ("test123");
test = ("test123","abc","xyz");
test = ("test123","abc");
}
{
test1 = ("passfile","pasfile1","user");
test1 = ("passfile");
test1 = ("passfile","pasfile1");
}
{
test2 = ("temp");
test2 = ("temp","temp1");
test2 = ("temp","temp1","username");
}
{
test3 = ("betty","betty1","jack");
test3 = ("betty","betty1");
test3 = ("betty");
}
[/code]

[output]
test  =  ("test123","abc","xyz");
test1  =  ("passfile","pasfile1","user");
test2  =  ("temp","temp1","username");
test3  =  ("betty","betty1","jack");
[/output]
 
best,
Shaji 
-------------------------------------------------------------------------------
Your talent is God's gift to you. What you do with it is your gift back to God.
-------------------------------------------------------------------------------


________________________________
 From: punit jain <contactpunitj...@gmail.com>
To: "beginners@perl.org" <beginners@perl.org> 
Sent: Tuesday, 8 January 2013 5:58 PM
Subject: Regex help needed
 
Hi ,

I have a file as below : -

{
test = ("test123");
test = ("test123","abc");
test = ("test123","abc","xyz");
}
{
test1 = ("passfile");
test1 = ("passfile","pasfile1");
test1 = ("passfile","pasfile1","user");
}

and so on ....

The requirement is to have the file parsing so that final output is  :-

test = ("test123","abc","xyz");
test1 = ("passfile","pasfile1","user");

So basically only pick the lines with maximum number of options for each
type.

Regards.

Reply via email to