in reply to Data::Table - empty values - avoid warnings

One possible solution would be to make sure you check that the cell value is in fact numeric (or an integer as shown below) before you use in a calculation:
$ perl use strict; use warnings; use Data::Table; my $t = new Data::Table([ [ 1, 2, 3 ], [ 10, 20, " " ] ], [ 'A', 'B' ] +, 1); # create emtpy column my @newCol = (); $newCol[ $t->nofRow - 1 ] = undef; $t->addCol(\@newCol, 'adding_up'); # Put the formula in the empty column $t->colsMap( sub { $_->[2] = ((defined($_->[0]) && $_->[0] =~ m/^\d+$/) ? $_->[0] : 0) + ((defined($_->[1]) && $_->[1] =~ m/^\d+$/) ? $_->[1] : 0); } ); print $t->csv; __END__ A,B,adding_up 1,10,11 2,20,22 3, ,3
See also How do I determine whether a scalar is a number/whole/integer/float?.
--
Andreas

Replies are listed 'Best First'.
Re^2: Data::Table - empty values - avoid warnings
by andreas1234567 (Vicar) on Oct 25, 2007 at 07:39 UTC
    ((defined($_->[0]) && $_->[0] =~ m/^\d+$/) ? $_->[0] : 0)
    Am I correct if I assume that here $_ is defined as 'one single digit or maybe a few digits (d+, no spaces and stuff like that in between the digits) and then if this is not the case it should be a 0 (zero)?
    Almost. It means that $_->[0] is
    • defined, and
    • one or more digits 0-9
    I would have made it a function to make it more readable:
    $ perl use strict; use warnings; use Data::Table; my $t = new Data::Table([ [ 1, 2, 3 ], [ 10, 20, " " ] ], [ 'A', 'B' ] +, 1); # create emtpy column my @newCol = (); $newCol[ $t->nofRow - 1 ] = undef; $t->addCol(\@newCol, 'adding_up'); # Return input if input is an integer, otherwise zero sub to_int_or_zero { my $value = shift; if (defined($value) && $value =~ m/^\d+$/) { return $value; } else { return 0; } } # Put the formula in the empty column $t->colsMap( sub { $_->[2] = to_int_or_zero($_->[0]) + to_int_or_zero($_->[1]); } ); print $t->csv; __END__ A,B,adding_up 1,10,11 2,20,22 3, ,3
    --
    Andreas
      okay thanks a lot. I'm almost there but found out that actually the columns I'm working on have a lot of numbers that have as a decimal separator a 'comma'. For example in the blank spot number like 2,3 as opposed to the 'space'. To work around that I thought to do
      sub to_int_or_zero { my $value = shift; $value =~ s/,/\./; if (defined($value) && $value =~ m/^\d+$/) { return $value; } else { return 0; } }
      but it doesn't work. The 2,3 nicely changes into 2.3 but I'm obviously making a very elementary mistake that I can't understand myself at this moment as the row adds up to ... 3
      : (
Re^2: Data::Table - empty values - avoid warnings
by GertMT (Hermit) on Oct 24, 2007 at 20:23 UTC
    thanks for your reply. I'm a bit puzzled with the regex.
    ((defined($_->[0]) && $_->[0] =~ m/^\d+$/) ? $_->[0] : 0)

    Am I correct if I assume that here $_ is defined as 'one single digit or maybe a few digits (d+, no spaces and stuff like that in between the digits) and then if this is not the case it should be a 0 (zero)? Never used this ternary operator and just want to make sure that's what it is.
    thanks
      Am I correct if I assume that here $_ is defined as 'one single digit or maybe a few digits ...

      No, $_ is array reference not a scalar. $_ is not being tested for simple number-ness, but the deferenced value, $_->[0], is. Other than that, you are correct in your reading about which value is eventually going to be added.

      - parv

        Oh, but a array reference is a scalar, if only a special type of it.

        No, $_ is array reference not a scalar.

        That was rather thoughtless of me. First sentence should have been: "No, $_ is array reference (not a simple value)."

        -parv