I can tell you right off the top that a bunch of your property names are incorrect. Here is what the property names should be (I've only included the ones to which you were actually giving data):
$NewContact->{FullName}=
$rec->{first_name} . ' ' . $rec->{last_name};
$NewContact->{Title} = $rec->{title};
$NewContact->{FirstName} = $rec->{first_name};
$NewContact->{LastName} = $rec->{last_name};
$NewContact->{BusinessTelephoneNumber} =
join '-', $rec->{prefix1}, $rec->{suffix1};
if ($rec->{prefix2}){
$NewContact->{Business2TelephoneNumber} =
join '-', $rec->{prefix2}, $rec->{suffix2};
} else {
$NewContact->{Business2TelephoneNumber} = '27';
}
$NewContact->{CompanyName} = $rec->{company};
$NewContact->{PrimaryTelephoneNumber} =
join '-', $rec->{prefix1}, $rec->{suffix1};
$NewContact->{OfficeLocation} = $rec->{location};
$NewContact->{User1} = $rec->{site};
$NewContact->{"Email1Address"} = 'mytest@mytest.com';
See if that helps. Use that browser that I pointed out to actually investigate the 'ContactItem' class object, and use the exact name given for the other properties in question.
C-.
Update: To answer your other questions. You should read the Win32::OLE documentation first. The GetActiveObject method is described there, as it's a part of that package.