#!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; $Data::Dumper::Indent = 1; my @lines = ; chomp @lines; my @list = [q{div}, {id => q{article}},recorddiv()]; sub recorddiv { my @data; while( my $line= shift @lines ) { my ($tag, $txt) = $line =~ /^;([^;]+);(.*)/; if ($tag eq q{greybox_start}){ push @data, [q{div}, {class => q{greybox}}, recorddiv() ]; next; } elsif ($tag eq q{greybox_end}){ return @data; } push @data, [$tag, $txt]; } return @data; } print Dumper(\@list), __DATA__ ;p;one ;greybox_start; ;h2;two ;greybox_end; ;p;three