in reply to Find nonnumeric scalars

Maybe I misunderstand the question but, once you split your line into an array, you can test fields 6, 7 and 8 by doing something like this
use Scalar::Util (); # as advised by [choroba] my ($line, @arr); open my $fh, "<$ARGV[0]" or die "failed to open file $ARGV[0] for reading: $!\n"; my @check_fields = (6, 7, 8); my $line_counter = 0; LINE: while ($line = <$fh>) { $line_counter++; ### skip line if any of fields 6-8 are not numeric @arr = split /\s+/, $line; foreach my $i ( @check_fields ) { if ( ! Scalar::Util::looks_like_number($arr[$i - 1]) ) { # bad;this checks only for positive integers # (thanks Not_a_Number) # if ($arr[$i - 1] !~ /^\d+$/) { print STDERR "line num $line_counter: " . "1st problem field $arr[$i - 1]: " . "field num $i: " . "$line\n"; next LINE; } } ### the rest of your code }
This is just to show general approach. Code that does splitting and checking needs to be be extracted into a separate subroutine. With respect to "millions of lines" context of the question, not sure how efficient or inefficient this code is. Caching of test results could be useful, but then caching can take a lot of memory and backfire.

Update: took into account Not_a_Number's comment. Added comment on "millions of lines" issue.

Replies are listed 'Best First'.
Re^2: Find nonnumeric scalars
by Not_a_Number (Prior) on Jan 29, 2015 at 18:41 UTC

    Scalars -7, 4.55, and 10e6 are all numeric. Your regex /^\d+$/ tests only for positive integers.

    Update: Minor tpyo

    Update 2: hotpelmen has now completely altered the content of her/his original post, without indicating that (s)he has made any changes (note to hotpelmen: this is considered Bad Form on PM).

      Yeah, you caught me in the middle of my updates. I saved a few times before adding update statement. No preview for updates, that's a problem. Sorry for distress.
      Good point. Fixing.