How about something like this:
use Fcntl ':flock';
open my $fh, '+<', 'images.dat' or die "open failed: $!";
flock $fh, LOCK_EX;
seek $fh, 0, 0;
my @images;
while (<$fh>) {
chomp;
push @images, [(split /:/)[-1], $_];
}
my @ordered =
map { $_->[1] }
sort { $a->[0] <=> $b->[0] }
@images;
seek $fh, 0, 0;
truncate $fh, 0;
print $fh join "\n", @ordered;
close $fh;
Update: My brain isn't taking shortcuts today. I like Aristotle's approach of passing the file read directly to map(). Didn't think of it for some reason. So a slightly simplified version:
use Fcntl ':flock';
open my $fh, '+<', 'images.dat' or die "open failed: $!";
flock $fh, LOCK_EX;
seek $fh, 0, 0;
my @ordered =
map { $_->[1] }
sort { $a->[0] <=> $b->[0] }
map { chomp; [(split /:/)[-1], $_] }
<$fh>;
seek $fh, 0, 0;
truncate $fh, 0;
print $fh join "\n", @ordered;
close $fh;