HTML::HashTable is a quite old module, but it does exactly what you want. It even takes care of nested data-structures.
use Modern::Perl qw/2015/;
use CGI;
use HTML::HashTable;
my %fruits = (
apple => {
'granny smith' => 'green',
'pink lady' => 'red',
'golden delicious' => 'yellow'
},
melon => 'yellow',
strawberry => 'red',
blueberry => 'blue',
durian => 'light yellow'
);
my $cgi = CGI->new();
print $cgi->header(),
$cgi->start_html("Fruits and colors"),
tablify( { DATA => \%fruits, } ),
$cgi->end_html();
Output:
Content-Type: text/html; charset=ISO-8859-1
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-U
+S">
<head>
<title>Fruits and colors</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1
+" />
</head>
<body>
<table border=1>
<tr>
<td>apple</td>
<td>
<table border=1>
<tr>
<td>golden delicious</td>
<td>yellow</td>
</tr>
<tr>
<td>granny smith</td>
<td>green</td>
</tr>
<tr>
<td>pink lady</td>
<td>red</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>blueberry</td>
<td>blue</td>
</tr>
<tr>
<td>durian</td>
<td>light yellow</td>
</tr>
<tr>
<td>melon</td>
<td>yellow</td>
</tr>
<tr>
<td>strawberry</td>
<td>red</td>
</tr>
</table>
</body>
</html>
apple |
golden delicious |
yellow |
granny smith |
green |
pink lady |
red |
|
blueberry |
blue |
durian |
light yellow |
melon |
yellow |
strawberry |
red |
Update: Added missing closing </table> tag. Thank you beech
CountZero
A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James
My blog:
Imperial Deltronics