use warnings; use strict; use Data::Diver qw/Dive/; use Text::CSV; my @data = ( { Company => { companyname => "Randomcompany" }, Address => { city => "Randomcity", street_and_nr => "SampleStreet 123", zip => "45678" }, Phone => { Telephone => "0123-4 56 78 90" }, }, { Company => { companyname => "Other Company" }, Address => { address => "Someplace 42\n12345 City" }, Phone => { Telefax => "333", Telephone => "+1 234 567 8900" }, } ); my $csv = Text::CSV->new({binary=>1, auto_diag=>2, eol=>$/ }); $csv->print(select, ['Company','Address','Phone','Fax']); for my $rec (@data) { my $addr = Dive($rec, 'Address', 'address') || Dive($rec, 'Address', 'street_and_nr') ."\n".Dive($rec, 'Address', 'zip') ." ".Dive($rec, 'Address', 'city'); $addr =~ s/\n/, /g; my @cols = ( scalar Dive($rec, 'Company', 'companyname'), $addr, scalar Dive($rec, 'Phone', 'Telephone'), scalar Dive($rec, 'Phone', 'Telefax'), ); $csv->print(select, \@cols); } __END__ Company,Address,Phone,Fax Randomcompany,"SampleStreet 123, 45678 Randomcity","0123-4 56 78 90", "Other Company","Someplace 42, 12345 City","+1 234 567 8900",333