My solution uses the Schwartizan Transform, a good technique to get familiar with when you're doing more complicated sorting...
First, you want to use map to turn each element of the array into an arrayref that contains the split-up line. Then, you sort based on the 1st (not 0th) element of the arrayref, which is the first field of your line. Then, you use another map to return the array element back to normal. Voila:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
chomp( my @array = <DATA> );
@array = map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, split /!/ ] } @array;
print Dumper \@array;
__DATA__
100!100!key!date!2..
100!100!key!store!
110!110!P\d\d\d_.*\.\d{6,}\.EMRemr
120!125!
1!yeada
130!132!
140!133!
150!134!
500!blah
160!135!arbor_ama
503!blah
170!136!
505!blah
180!137!
190!138!
"We're experiencing some Godzilla-related turbulence..."