You may have good reason for making copies of arrays in your broader application, but in the example the copies are not necessary. You might consider:
$policies{$ruleNum} = [ $ruleName, $srcZone, \@srcList, $dstZone, \@ds
+tList, \@svcList, $ruleAction ];
sub get_address_policies {
my $targetAddr = shift;
my $targetType = shift;
my $targetRole = shift;
foreach my $policy (keys %policies) {
my $polMembers = $policies{$policy}[
(lc($targetRole) eq "source") ? 2 : 4
];
foreach my $polMember ( @{$polMembers} ) {
print "$polMember\n";
}
}
}