in reply to Re: Can't get hash keys to print
in thread Can't get hash keys to print

Hello again, I understand your suggested expression, and I feel like it should work but it isn't. It isn't matching anything.
This is a few sample input lines...
2015/04/06 12:38:15 (9):(5564) Return code is :55
2015/04/06 12:38:15 (9):(6600) Return code is :55
2015/04/06 12:41:31 (9):(3604) Return code is :1

Replies are listed 'Best First'.
Re^3: Can't get hash keys to print
by AnomalousMonk (Archbishop) on Aug 24, 2015 at 19:20 UTC

    Assuming there are any number of  space \t \r \n etc. at the end of each line, try something like:

    c:\@Work\Perl\monks>perl -wMstrict -MData::Dump -le "my $string = 'Return code is'; ;; my %errors; for my $row ( qq{2015/04/06 12:38:15 (9):(5564) Return code is :55\n\r\n}, qq{2015/04/06 12:38:15 (9):(6600) Return code is :55 \r\n\r}, qq{2015/04/06 12:41:31 (9):(3604) Return code is :1\t\n\r}, ) { ++$errors{$1} if $row =~ m{ \Q$string\E \s* : (\d+) \s* \z }xms; } dd \%errors; ;; my $total; for my $err_no (sort { $a <=> $b } keys %errors) { print qq{error $err_no - $errors{$err_no} total}; $total += $errors{$err_no}; } print qq{total errors: $total}; " { 1 => 1, 55 => 2 } error 1 - 1 total error 55 - 2 total total errors: 3


    Give a man a fish:  <%-{-{-{-<

Re^3: Can't get hash keys to print
by stevieb (Canon) on Aug 24, 2015 at 19:11 UTC

    Something else isn't right then. Using the data you supplied above (which you should copy to your actual question for future readers), and copy/pasting Athanasius' regex, here's what I get in %errors:

    use warnings; use strict; my $string = "Return code is"; my %errors; while (<DATA>){ ++$errors{$1} if /\Q$string\E \s* : \s* (\d+) $ /x; } while (my ($k, $v) = each %errors){ print "$k: $v\n"; } __DATA__ 2015/04/06 12:38:15 (9):(5564) Return code is :55 2015/04/06 12:38:15 (9):(6600) Return code is :55 2015/04/06 12:41:31 (9):(3604) Return code is :1

    Output:

    1: 1 55: 2
      I think it's the format of the input file. (UNIX)
      I removed the $ from the regex and it works fine.
      I don't quite understand why though.