http://qs1969.pair.com?node_id=11137726


in reply to dumper hash incorrect?

You have carriage return whitespace at the end of your input, most likely because your input file is formatted with "Windows" newlines, that is \r\n.

Data::Dumper will show you that whitespace when you set $Data::Dumper::Useqq = 1.

Personally, I like to, instead of chomp, use s!\s+$!!, to remove all kinds of whitespace at the end of input lines.

Replies are listed 'Best First'.
Re^2: dumper hash incorrect?
by BillKSmith (Monsignor) on Oct 19, 2021 at 17:47 UTC
    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' };
    Bill