use warnings; use strict; $/ = ''; while () { m|\G[\n\s]*(.*?)
[\n\s]*(.*?)(?:
[\n\s]*(.*?))?(?:
){2}[\n\s]*|isg; my $url = $3 || ""; print "Name: $1\nAddr: $2\nURL: $url\n\n"; } #### __DATA__ Name
Address
URL

Name2
Address2

Name: Name Addr: Address URL: URL Name: Name2 Addr: Address2 URL: