Foreach doesn't require an actual array to work from; it's perfectly content to work on the list returned from split:
foreach my $entry ( split( /;/, $file_data ) ) {
do { s/^\s+//; s/\s+$//; } for $entry;
push @email_list, $entry;
}
Of course you can use map and get everything in one statement.
print join( "\n", sort map { (my $t=$_)=~s/^\s+//;$t=~s/\s+$//;$t } sp
+lit( /;/, $file_data ) ), "\n";
Update: Of course if you need the list later you can certainly store the return from the sort into a variable and print that instead.
my @email_list = sort map ... split( /;/, $file_data );
print join( "\n", @email_list ), "\n";
The cake is a lie.
The cake is a lie.
The cake is a lie.