If the file is known to have Windows line separators, I prefer to read it same way that windows does (use the :crlf IO-layer) and process it as a normal file rather than use a DIY solution.
use strict;
use warnings;
use Autodie;
use Data::Dumper;
my $file = \do{
"Jay|Jay\@email|puppy|123 Street|Shirley\r\n"
."Travis|Travis\@email|puppy|456 Street|Emmy\r\n"
."Trisha|Trisha\@email|baby|789 Street|Eddie\r\n"
."Eddie|Eddie\@email|puppy|789 Street|Trisha\r\n"
."Shirley|Shirley\@email|baby|123 Street|Jay\r\n"
};
open my $fh, '<:crlf', $file ;
my @name_lines = <$fh>;
my %spouses;
my %people;
foreach my $line ( @name_lines ) {
chomp($line) ;
my @data = split '\|' , $line ;
#map { $_ =~ s/[^a-zA-Z0-9_\@\. ]//g } @data ;
#print Dumper \@data ;
my ( $name , $email , $wishlist , $address , $spouse_name ) =
+@data ;
$people{$name}{email} = $email ;
$people{$name}{wishlist} = $wishlist ;
$people{$name}{address} = $address ;
$people{$name}{spouse} = $spouse_name ;
#if ( $spouse_name ne '' ) {
if ( defined $spouse_name and $spouse_name ne '' ) {
$spouses{$name} = $spouse_name ;
}
}
print Dumper \%spouses ;
RESULT:
$VAR1 = {
'Shirley' => 'Jay',
'Jay' => 'Shirley',
'Eddie' => 'Trisha',
'Trisha' => 'Eddie',
'Travis' => 'Emmy'
};
|