Sure, also be sure to check out
perlreftut,
perlref,
perllol,
perldata and
perldsc for details on references. and their use in data structures.
@ArrayInMemory is what is called an AoA (array of arrays). In order to include an array inside another without it being converted into a single flat array, you make it an array reference (delimited by
[ and
] instead of
( and
)).
In the
foreach loop
$row gets assigned to an element in the
@ArrayInMemory array. That element is an Array Reference, not the array which
Text::CSV's combine method requires. Luckily we can 'dereference' an Array Reference back into an array by adding an @ to the beginning (
@$row) indicating we are interested in the dererferenced array, not the array reference in
$row.
The reason I would choose this method is that seems, to me, a natural fit, COPY FROM accepts CSV, Text::CSV produces it. This is especially helpful if your data potentially contains data that would need to be escaped before being sent to COPY FROM, Test::CSV handles all the ugly details of that for you. The first solution assumes you already have a string for each row you are submitting to Pg, which is difficult for me to imagine being the case, you are more likely to have a collection of fields (in an AoA or similar structure) which you need to combine. Instead of joining them yourself and worrying about escaping rules (which are different between Perl, Pg and CSV), use a well-tested and recommended module instead.