John W. Burns am Donnerstag, 28. September 2006 17:11:
> Sorting DBM Hash
> Greetings:

Hello John W.

> I've run into what appears to be a conflict in sorting
> a DBM Hash.  The DBM is opened and closed through tie and untie to store
> selections
> from Perl Tk medical questionnaire which uses checkboxes, radio buttons and
> lists, and contains over 200 items.  I'm attempting to verify that all user
> selections are accurately stored in the DB.
> The first sort routine prints out keys and value.  However it fails to
> include
> some keys such as variable ckb_100 or ckb_104 (or their values) along with
> a few other variables.
> When I use Randal Schwartz's sort from Learning Perl, it (by design) lists
> keys sorted by value order (without listing values), but includes all keys
> in the
> DB including those keys dropped in the first sort.  I have reviewed the
> PerlTk program a number of times and can't find an error (realize
> this doesn't mean there isn't one).  But why would Randal's sort contain a
> key that is not included in the other sort? Randal's sort indicates all
> user selections are included in DB; other sort does not.
>
> Here's the first sort code on the DBM Hash; it fails to list all keys and
> their values.
>  #!/usr/local/bin/perl
>  use warnings;

use strict;

>  use SDBM_File; #load database module which is a clone of DBM provided by
> ACTIVE STATE
>    $db = "c:/temp/userstats.db";  #where data is kept between runs
>  dbmopen(%DATA,  $db, 0666 ) or die( "Can't open: $!" );
>
>  foreach my $key ( sort { $a <=> $b } keys %DATA ) {

Try to replace the numerical comparison '<=>' with the alphanumerical 'cmp' 
one, since your keys are alphanumerical.

Didn't you get a warning of the sort
"Argument "ckb_100" isn't numeric in sort at -e line x."?


>       print "$key => $DATA{$key}\n";
>  }
>
> Here's Randal Schwartz', Learning Perl,sort; it lists all keys.
>  #!/usr/local/bin/perl
>  use warnings;
>  use SDBM_File; #load database module which is a clone of DBM provided by
> ACTIVE STATE
>  $db = "c:/temp/userstats.db";    #where data is kept between runs
>  dbmopen(%DATA,  $db, 0666 ) or die( "Can't open: $!" );
>
>  my @choices = sort by_score_and_name keys %DATA;
>  sub by_score_and_name {
>   $DATA{$b} <=> $DATA{$a} #by descending numeric score
>    or
>   $a cmp $b   #ASCIIbetically by name

                 ^
                 hint

>  }
>  print "@choices, \n";
>  dbmclose(%DATA);
>
> Here's a typical PerlTk GUI:
>   #Post Traumatic Stress Disorder
>  $ckb_100 = $frme_name1a -> Checkbutton(-text=>"post traumatic stress
> disorder", -variable=>\$post2,
>   -command =>\&variable_100);
>  $ckb_100-> deselect();
>  $ckb_100-> form(-left=>460, -top=>585);
>
> An anonymous sub routine is used to hold sub routines
> for all the question variables.  Here's a standard sub for
> checkbox.
>   sub variable_100 {
>   my $x = ${$ckb_100 ->cget(-variable)};
>    if ($x == 1)  {
>    $DATA{ckb_100} = "1";
>    }
>   else {
>
>   }
>
>  }


Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to