blackadder has asked for the wisdom of the Perl Monks concerning the following question:
Hi Guys;
I have data like this;
Thanks
I have data like this;
And I need to produce this output;server_A, Perl, UK server_A, Word, UK server_A, Outlook, UK server_A, Excel, UK server_B, Reuters, NL server_B, TradeXL, NL server_B, Thompsons, NL server_B, Bloomberg, NL server_B, Tibco, NL server_c, BasketLink, USA server_c, Evolution, USA server_c, Lotus, USA server_c, TIB, USA server_A, Python, UK
So, I wrote this code;server_A Perl UK Word UK Outlook UK Excel UK Python UK server_B Reuters NL TradeXL NL Thompsons NL Bloomberg NL Tibco NL server_c BasketLink USA Evolution USA Lotus USA TIB USA
Basically I need help with the logic of the script. It works fine if all entries relating to one item are repeated consecutively. However if entries were not listed consecutively, then this script will not produce the required output. I suppose the easy way around it is to sort the list alphabetically first and then run the script. The way I thought of doing it is by storing and indexing server names in an array then looping through the array and the list to pluck out the related item, this approach was taking ages and involved a lot of coding. So I just wondered how would you or could this be achieved easier and faster but from within the code?#! c:/perl/bin/perl.exe use strict; open (LST,"c:/work/test_data.lst") || die "\n$!\n"; chomp (my @data_array = <LST>); my $snap_shot; my %seen; my @cleaned_data; foreach my $data ( @data_array) { my $rec; my ($server, @info) = split (/,/,$data); if (! $seen{$server}) { $rec->{Server_Name} = $server; print "$server\n"; $seen{$server}++; print "\t@info\n"; @{$rec->{Apps_Info}} = @info; } else { print "\t@info\n"; @{$rec->{Apps_Info}} = @info; } push (@cleaned_data, $rec); }
Thanks
Blackadder
|
---|
Back to
Seekers of Perl Wisdom