Re: Sort hash keys in C...

Tim Bunce <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
On Wed, Apr 23, 2008 at 12:17:42AM +0100, Rudolf Lippan wrote:
> On Tue, 22 Apr 2008 11:24:17 +0100, Tim Bunce <[email protected]> wrote:
> > Any volunteers, either for both or just the sort function?
> 
> Hi Tim,
> 
> I would be happy to take a crack at them tomorrow -- actually I have a
> rough draft implementation that I will work on cleaning up and testing. 

Great!

Here's a more refined and detailed outline. It's evolved from one I
wrote up for "Sir Woody Hackswell" <[email protected]> (who also
expressed off-list an interest in implementing it, though I'd guess
hasn't done much yet).


API:

    _concat_hash_sorted( $hash_ref, $kv_separator, $pair_separator, $value_format, $sort_type )

Then the ParamValues for ShowErrorStatement can be formatted using:

    _concat_hash_sorted( $sth->{ParamValues}, "=", ", ", 0, undef )

Here's a rough sketch of the logic broken up into steps that would
roughly match a C implementation:

sub _concat_hash_sorted {
    my ( $hash_ref, $kv_separator, $pair_separator, $value_format, $sort_type ) = @_;
    # $value_format: false=use neat(), true=dumb quotes
    # $sort_type: 0=lexical, 1=numeric, undef=try to guess

    $keys = _get_sorted_hash_keys($hash_ref, $sort_type);
    my $string = '';
    for my $key (@$keys) {
        $string .= $pair_separator if length $string > 0;
        my $value = $hash_ref->{$key};
        if ($value_format) {
            $value = (defined $value) ? "'$value'" : 'undef';
        }
        else {
            $value = neat($value,0);
        }
        $string .= $key . $kv_separator . $value;
    }
    return $string;
}

sub _get_sorted_hash_keys {
    my ($hash_ref, $sort_type) = @_;
    if (not defined $sort_type) {
        my $first_key = (each %$hash_ref)[0];
        $sort_type = looks_like_number($first_key);
    }
    my @keys = keys %$hash_ref;
    @keys = ($sort_type)
        ? sort sort_numerically @keys
        : sort sort_lexicaly    @keys;
    return \@keys;
}

Does that look okay?

(Note that this isn't trying to be general purpose. Like neat() it's a
97.8365% solution that fits the most common needs.)

Thanks!

Tim.

p.s. Some tests with reasonable coverage would be the icing on the cake!
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.