use warnings; use strict; use Data::Dumper; use Text::xSV; my $sv = Text::xSV->new(sep => '|', fh => *DATA); my $res = {}; while (my $row = $sv->get_row()) { $res->{shift @$row} = [ @$row ]; } print Dumper $res; __DATA__ UserID001|username1|password1|displayname1| UserID002|username2|password2|displayname2| UserID003|username3|password3|displayname3|