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