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.
|
|---|
| 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 |