in reply to Re^5: Putting Hash values into an array
in thread Putting Hash values into an array

First of all, you are amazing. Thank you for your help. One thing I didn't put in my example and should have, is some of the diagnosis codes in my arrays start with a letter (e.g., V21564, c5415). So, I am struggling with your lines that say:

for (sort { $a <=> $b } keys %{ $Diags{$key} } ) { if (exists $DiagCodes{$_}) { printf $fh1 " %s: %d, %d\n", $DiagNames{ $DiagCodes{$_} }, $_, $Diags{$key}->{$_}; } else { printf $fh1 " Unrecognized code: %d\n", $_; } }

because they are set up for a numeric value with the <=>, so I changed it to:

foreach (sort {$a cmp $b} keys %{$Diags}$key}})

I tried some other things, but that is the one with the least errors, although it is still not running through. I PROMISE this will be the last question I ask for a long time!! Any insight you can give would be amazing!

Replies are listed 'Best First'.
Re^7: Putting Hash values into an array
by Athanasius (Archbishop) on Mar 07, 2014 at 02:37 UTC

    Hello Raya4505,

    Changing the script to handle diagnosis codes as strings rather than integers is not difficult. First, I’ve changed the contents of the input file “2009.txt” as follows:

    Tom_Jones z9062 John_Smith V27783 Tom_Jones z9062 Jane_Brown 9100 Tom_Jones 28741 John_Smith z9062 Tom_Jones z9062 Jane_Brown z9062 Tom_Jones 28741 Jane_Brown c2853 Jane_Brown z9062 Tom_Jones 12345

    Next, the script itself. You’ve already handled the most challenging part by changing the sort operator from <=> to cmp. The only other changes required are to the array initialisations and the printf formats:

    1. For the array initialisations, you need to quote the strings (because barewords are not allowed under strict 'subs'):

      my @ComplicationsSurgicalProcedMedCare_238 = ( 27661, 'V27783', 27788, + 'c2853', 28741); my @SuperficialInjuryContusion_239 = ('z9062', 9063, 9100, + 9101);

      Or, you can make use of Perl’s qw operator (on which, see: Quote Like Operators):

      my @ComplicationsSurgicalProcedMedCare_238 = qw(27661 V27783 27788 c28 +53 28741); my @SuperficialInjuryContusion_239 = qw(z9062 9063 9100 91 +01);
    2. The printf function format codes are as in C, and are detailed in the documentation for sprintf. %d formats its input as an integer, %s formats its input as a string. So this section of code:

      if (exists $DiagCodes{$_}) { printf $fh1 " %s: %d, %d\n", # *** Change here: ^ $DiagNames{ $DiagCodes{$_} }, $_, $Diags{$key}->{$_}; } else { printf $fh1 " Unrecognized code: %d\n", $_; # *** Change here: ^ }

      needs to be changed to:

      if (exists $DiagCodes{$_}) { printf $fh1 " %s: %s, %d\n", $DiagNames{ $DiagCodes{$_} }, $_, $Diags{$key}->{$_}; } else { printf $fh1 " Unrecognized code: %s\n", $_; }

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      AMAZING!! I was so close!! Thank you again for all your help. It works perfectly, and thank you for explaining it because that helped me learn. I read that article you linked and it really helped! Thanks again and if I post in the distant distant future, I hope you post again!