in reply to How to use TR to generate a table row

The CGI module in this usage is not very complex, it just makes use of anonymous or referenced hashes/arrays, which are a perpetual source of confusion. The important point to remember is that context counts!

Basically, any html element can be created with its name as the function name (but for the differences noted by davorg) where attributes are passed in a hash reference, and contents are passed in a list or array:

print comment('this creates one big blockquote'); print blockquote( {-cite => 'http://www.example.com/biblio'}, 'The quick fox jumps over the lazy dog.', br(), strong('See citation for details') );
Additionally, passing an array reference (or anonymous array) wraps each element of the referenced array in a seperate parent tag:
print comment('this creates two smaller blockquotes'); print blockquote( {-cite => 'http://www.example.com/biblio'}, [ 'The quick fox jumps over the lazy dog.', strong('See citation for details') ] );
So the two code snippets above generate this output (ive cleaned up the spacing manually, mind you):
<!-- this creates one big blockquote --> <blockquote cite="http://www.example.com/biblio"> The quick fox jumps over the lazy dog. <br /> <strong> See citation for details </strong> </blockquote> <!-- this creates two smaller blockquotes --> <blockquote cite="http://www.example.com/biblio"> The quick fox jumps over the lazy dog. </blockquote> <blockquote cite="http://www.example.com/biblio"> <strong> See citation for details </strong> </blockquote>

__________
The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.
- Terry Pratchett