Recursion means writing a sub that calls itself.. Write a parser that parses one vCard, and if it encounters a vCard inside the vCard, calls itself with the start of the new card? Passing out the result as a hashref, which can be added to the hash in the calling function..
Eg:
sub parsevcard
{
my ($inputstr, $inputpos) = @_;
my $currentcard = {};
# Parse current vCard starting at $inputpos position in $inputstr s
+tring..
# enter values in $currentcard hashref
if($inputstr =~ /\GBEGIN:VCARD/)
{
# We found another vcard, set $pos to beginnnig of new card, an
+d call ourselves again..
$currentcard->{AGENT} = parsevcard($inputstr, $pos);
}
return $currentcard;
}
Untested!
C.