in reply to creating a variable in an if statement

Variables are only available (by name) in the statement following the one in which they are declared. It allows the following to work.

my $var; ... { my $var = $var; ... }

So the key is to not refer to the new var by name or to put multiple statements in the if expression.

The only think that comes to mind is

if ( sub { our @f; local *f = $_[0]; (@f = some_code()) == 1 || (@f = some_other_code()) == 1 }->(\my @f) ) { #... }

Yuck.

This isn't a general purpose solution, but it works here:

if (my @f = do { my @f; ((@f = some_code()) == 1 || (@f = some_other_code()) == 1) ? @f : ( +) }) { #... }

Yuck.

Update: Added a missing pair of parens to the last snippet.