in reply to How to print after using getline_hr (Text::CSV_XS)?

The print method expects an array reference, not a hash reference:

use v5.12; use warnings; use Text::CSV_XS; my $csv = Text::CSV_XS->new ({ binary => 1, sep_char => ";", eol => $/, auto_diag => 1, }); my @fields = qw( ID NAME INDICATOR VALUE CI_LOW CI_HIGH ); $csv->print (*STDOUT, \@fields); say ''; my @columns = @{$csv->getline (*DATA)}; $csv->column_names (@columns); while (my $hr = $csv->getline_hr (*DATA)) { # my @nr = @{$hr}{'ID'}; $hr->{ID} =~ s/12/Sun/g; $hr->{ID} =~ s/17/Moon/g; $csv->print (*STDOUT, [ map { $hr->{$_} } @columns ]); }

Much easier to read and much faster too would be to use bind_columns

my @fields = qw( ID NAME INDICATOR VALUE CI_LOW CI_HIGH ); $csv->print (*STDOUT, \@fields); my @columns = @{$csv->getline (*DATA)}; my %rec; $csv->bind_columns (\@rec{@columns}); while ($csv->getline (*DATA)) { $rec{ID} =~ s/12/Sun/g; $rec{ID} =~ s/17/Moon/g; $csv->print (*STDOUT, [ @rec{@columns} ]); }

update: I stripped the data sections from the code as they are identical to those in the OP and reduced the second example to show only the changed part.


Enjoy, Have FUN! H.Merijn

Replies are listed 'Best First'.
Re^2: How to print after using getline_hr (Text::CSV_XS)?
by vagabonding electron (Curate) on Nov 09, 2011 at 13:08 UTC
    Thank you very much for your help Tux!
    I changed now the printing of the header too so that I do not need to hardcode the fields anymore:
    my @columns = @{$csv->getline (*DATA)}; $csv->print (*STDOUT, \@columns);
    Thanks again!
    VE