## name Basic forward for/foreach
## failures 2
## cut

for (%hash) {
foreach (%hash) {

## name forward for/foreach with variable
## failures 2
## cut

for $foo (%hash) {
foreach $foo (%hash) {

## name forward for/foreach with lexical variable
## failures 2
## cut

for my $foo (%hash) {
foreach my $bar (%hash) {

## name postfix variations
## failures 4
## cut

print for %hash;
print for %{$hash};
print for %{ something() };
print foreach %hash;

## name reference variation
## failures 8
## cut

for my $foo (%{$hash}) {
foreach my $bar (%$hash) {
for $foo (%{$hash}) {
foreach $foo (%$hash) {
for (%{$hash}) {
foreach (%$hash) {
print for %{$hash};
print foreach %$hash;

## name Correct patterns
## failures 0
## cut

for my $foo (keys %hash) {
for my $foo (values %hash) {
foreach my $bar (keys %hash) {
for $foo (values %hash) {
foreach $foo (keys %hash) {
for (values %hash) {
foreach (keys %hash) {
print for values %hash;
print foreach keys %hash;
print for ( values %hash );
print foreach (keys %hash);
print foreach (keys %{$hash});
print foreach (keys %{ some_big_thing() });
for my $k (%foo ? sort keys %foo : sort keys %bar) {
for my $k (%{$foo} ? sort keys %{$foo} : sort keys %{$bar}) {
for my $k (%{ func() } ? sort keys %{ func() } : sort keys %{ func() }) {

## name Using "for"/"foreach" as hash key
## failures 0
## cut

$hash{for}
$hash->{for}
$hash->{ for }

$hash{foreach}
$hash->{foreach}
$hash->{ foreach }

# These came from Ahmed Abdrabo and Andy Lester
## name thing() for @array statement
## failures 0
## cut

print for @INC
say for @INC
END { $dbh->do("DROP TABLE $_") foreach @table }
{ print foreach @y }
{ print foreach 1..2 }
{ print foreach @y; }
{ print }
print foreach @y;

## name thing() for %hash statement
## failures 7
## cut

print for %INC
say for %INC
END { $dbh->do("DROP TABLE $_") foreach %tables }
{ print foreach %y }
{ print foreach %{@y} }
{ print foreach %y; }
print foreach %y;

## name Variable attributes
## failures 1
## cut

# this is fine
for my Dog $foo (@bar) { }
for my Foo::Bar $foo (@bar) { }

# fails
for my Foo::Bar $foo (%bar) { }

## name Reference Aliasing
## failures 0
## cut
foreach \my %hash (@array_of_hash_references) {}

## name Empty postfix loop
## failures 0
## cut
for Class->method($foo);