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 [EMAIL PROTECTED];
}

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!

Reply via email to