in reply to expanding variables in variables

First, I'd like to note that the guts of your pipeline can be replaced by pure Perl code. All you really need to call is the iptables command. That said, the reason you're not getting Perl variables interpolated into your qx is because you're using single quotes as the delimiter. Try this instead:

for (0 .. 2) { my $output = qx{echo '\$_ is $_'}; print $output; }

As for moving that into a better data structure, my first thought is an array of arrays, but the exact structure you'll want really depends on what you want to do with it:

my @things; for (0 .. 2) { my @inv = ...; my @outv = ...; push @things, [ \@inv, \@outv ]; }