in reply to Get file min and max size help!

push @files , grep { -f && -s >= $min_size && -s <= $max_size "$d +/$_" } read_dir($d);

There is no operator between -s <= $max_size and "$d/$_", and you can't modify the return value of grep anyways.

You are stating the same file three times when you only need to stat it once.

You need something like either:

push @files, grep { -f && -s _ >= $min_size && -s _ <= $max_size } + read_dir( $d, prefix => 1 );

Or:

push @files, map { -f "$d/$_" && -s _ >= $min_size && -s _ <= $max +_size ? "$d/$_" : () } read_dir( $d );