case insensitive hash

Jiri Polcar polcar na physics.muni.cz
Středa Červen 15 17:52:51 MEST 2005


    Zdravim,

potreboval bych, aby klice hashovyho pole bylo case insensitive. Nasel
jsem, ze to muzu udelat takto:

    use strict;
    use TieFolded;

    my $hash = {};

    tie %{$hash},  'TieFolded';

    $hash->{'pepa'}  = 1;
    $hash->{'pEPa'} += 1;

    print "Pepa: ", $hash->{'pepa'}, "\n";

Modul TieFolded uvadim na konci mailu. Problem je, ze potrebuju, aby se
vlasnost nerozlisovani velikosti pismen v klicich "dedila" i do hashoveho
pole, ktere tvori hodnotu $hash->{'karel'}. Takto:

    $hash->{'karel'} = {};

    tie %{$hash->{'karel'}},  'TieFolded';

    $hash->{'karel'}->{'abc'}  = 2;
    $hash->{'kAREl'}->{'aBc'} += 2;

    print "Karel->abc: ", $hash->{'karel'}->{'abc'}, "\n";


Jenze takto rucne to nemohu pouzit, protoze poli jako hash->{'karel'}
mam moc, nacitam je ze souboru. Lze tedy nejak jednoduse zaridit, aby
vsechny urovne hashoveho pole $hash byly case insensitive?

S pozdravem, JP


    package TieFolded;

    use strict;
    use Tie::Hash;

    our @ISA = qw(Tie::StdHash);

    sub STORE {
        my ($self, $key, $value) = @_;
        return $self->{lc $key} = $value;
        }

    sub FETCH {
        my ($self, $key) = @_;
        return $self->{lc $key};
    }

    sub EXISTS {
        my ($self, $key) = @_;
        return exists $self->{lc $key};
    }

    sub DEFINED {
        my ($self, $key) = @_;
        return defined $self->{lc $key};
    }

    1;



Další informace o konferenci Perl