These fields are "space delimited", but they also seem to be in a fixed column format, so a look at pack/unpack and their various parameters. This would save you the trip to the regex engine, at the price of some more parsing time spent in the number parser that has to skip the spaces now. You can maybe save more time by making @lines and @data live in a larger scope, and you can save time by not shelling out to the join program:
local @ARGV = ($file1, $file2, $file3, $file4);
my (@lines) = <>;
my (@data);
for my $line (@lines) {
@data = split /\s+/, $line;
...
};