in reply to Reading files sequentially

Just treat your arrays as queues.
$img = shift @imgs; $link = shift @urls; # print statements here push @imgs, $img; push @urls, $link;
While I'm at it, I'd get rid of the temporary array, too:
while ($c = <DAT>) { ($id,$image,$url)=split(/\|/,$c); if ($type=~/^internal|partner$/) { push (@imgs,$image); push (@urls,$url); push (@des,$desc); } } close DAT;
I'd also point you to die and $! and maybe even unless in your open statement. But enough for now. :)

Update: Unless this program is run persistently, it won't work. Hmm -- if this program starts up again for each image, this method won't work, and you'll have to keep track of which image to serve in a file somehow.

In that case, I'd drop the randomizer and keep a counter file around. merlyn has some examples in his Web Techniques columns. Open the temp file, get the number, check to see if it's a valid index into the array. If not, reset it to zero. Serve the appropriate file, flock it, and write the incremented number to it.