in reply to where to declare a variable...

How are $file1 and $file2 getting in there? Are they poorly named globals? Furthermore your error message should include the filename, and if possible a stack backtrace (which is easily done by using Carp to confess). And while we are at it, you have blocks with almost entirely duplicated code, and the function does something entirely different from what its name promises. It claims to open a file. Instead it reads it into an array.

I would write that something like this:

use Carp; # Time passes... # takes a filename, and returns the contents of # the file as an array in array context, string in scalar. sub read_file { my $file = shift; local *IN; open(IN, "< $file") or confess("Cannot read '$file': $!"); return wantarray ? <IN> : join '', <IN>; }
More accurate name. Better error reporting. Less code duplication...