I am not sure what you want to achieve as @entries will be empty after the while loop whatever you do inside... However, the following should do what you want (not tested as I could not think of sample data).
while( @entries ) {
my $top = shift @entries;
@entries = map { compare_sub( $top, $_ ) > $user_defined_value ? $
+_ : () } @entries;
}
UPDATE: Reading the whole thread more carefully I realize that my proposal is essential the same (but more convoluted) as Tanktalus' grep above. Pls ignore...