Reputation: 891
I am using List::Compare
to compare two files and print out the output in html, but since I'm using arrays the output is coming out in one row instead of different rows.
example
file1.txt
aaaa
bbbb
cccc
dddd
file2.txt
aaaa
bbbb
cccc
eeee
code
use strict;
use warnings;
use Getopt::Long;
use List::Compare;
my $f1 = 'file1.txt';
open FILE1, "$f1" or die "Could not open file $f1 \n";
my $f2= 'file2.txt';
open FILE2, "$f2" or die "Could not open $f2 \n";
my $outputFile = 'finaloutput.txt';
my @body="";
push(@body, "<html> \n");
push(@body, "<head> \n");
push(@body, "<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"100%\" \n");
push(@body, " <TD>");
push(@body, "<div align=\"left\"><Table border=2 bordercolor= \"black\"> \n");
push(@body, "<tr bgcolor=\"ORANGE\"><TH><b>uniq in file1</b></TH><TH>uniq in file 2</TH><TH>common</TH></TR>");
push(@body, "<br>\n");
my @latest=<FILE1>;
my @pevious=<FILE2>;
my $compare = List::Compare->new(\@latest, \@pevious);
my @intersection = $compare->get_intersection;
my @firstonly = $compare->get_unique;
my @secondonly = $compare->get_complement;
print "Common in both:\n"."@intersection"."\n";
push(@body, "<tr><td>@intersection</td>\n");
print "uniq in first file:\n"."@firstonly"."\n";
push(@body, "<td>@firstonly</td>\n");
print "Items uniq in Second File:\n"."@secondonly"."\n";
push(@body, "<td>@secondonly</td></tr>\n");
push(@body, "</div></Table>" );
my $Joining= join('', @body);
push(@body, "</body></font>");
push(@body, "</html>");
print FILE"$Joining";
close FILE;
close FILE1;
close FILE2;
Here is the html output that I get for the first column:
<tr><td>aaaa
bbbb
cccc </td></tr>
I want to have:
<tr><td>aaaa</td> <td>bbbb</td><td>cccc</td></tr>
I hope I have explained it properly.
Upvotes: 0
Views: 452
Reputation: 91375
Change this line:
push(@body, "<tr><td>@intersection</td>\n");
to:
push @body, '<tr>', (map{'<td>'.$_.'</td>'}@intersection), '</tr>';
and the same for other arrays @firstonly
and @secondonly
If you want to remove the line-feed, you can do:
my @latest=<FILE1>;
chomp @latest;
my @pevious=<FILE2>;
chomp @pevious;
edit
According to your comment and if I well understand, try this:
Replace this bock
print "Common in both:\n"."@intersection"."\n";
push(@body, "<tr><td>@intersection</td>\n");
print "uniq in first file:\n"."@firstonly"."\n";
push(@body, "<td>@firstonly</td>\n");
print "Items uniq in Second File:\n"."@secondonly"."\n";
push(@body, "<td>@secondonly</td></tr>\n");
with this one:
my $nbrows = @intersection;
$nbrows = @firstonly if @firstonly > $nbrows;
$nbrows = @secondonly if @secondonly > $nbrows;
push @intersection, (" ")x($nbrows - @intersection);
push @firstonly, (" ")x($nbrows - @firstonly);
push @secondonly, (" ")x($nbrows - @secondonly);
for my $i(0..$nbrows-1) {
push @body, "<tr>";
push @body, "<td>$firstonly[$i]</td>";
push @body, "<td>$secondonly[$i]</td>";
push @body, "<td>$intersection[$i]</td>";
push @body, "<tr>\n";
}
Upvotes: 2
Reputation: 9016
This code
push(@body, "<tr><td>@intersection</td>\n");
simply interpolates the elements of the array into the string separated by spaces.
You want something like
push(@body, "<tr>");
push(@body, map {"<td>$_</td>"} @intersection);
push(@body, "</tr>");
Upvotes: 0