use strict; use warnings; my %hash = ( 'some item' => { 'source' => 'a source', 'conversions' => { 'conversion 1' => 'value 1', 'conversion 2' => 'value 2', 'conversion 3' => 'value 3', 'conversion 4' => 'value 4', 'conversion 5' => 'value 5', }, 'whatever' => 'eh', }, 'another item' => { 'source' => 'another source', 'conversions' => { 'conversion 1' => 'value 1', 'conversion 2' => 'value 2', }, 'whatever' => 'eh', }, 'one more item' => { 'source' => 'another source', 'whatever' => 'eh', }, ); my $obj = bless {data => \%hash}; for my $item ($obj->getItems ()) { print "$item->{name}: $item->{source}, $item->{whatever}\n"; } my %conversions = $obj->getConversions ('some item'); print "$_ => $conversions{$_}\n" for sort keys %conversions; sub getItems { my ($self) = @_; my $data = $self->{data}; return map {{name => $_, %{$data->{$_}}}} keys %$data; } sub getItem { my ($self, $itemName) = @_; return if ! exists $self->{data}{$itemName}; return $self->{data}{$itemName}; } sub getConversions { my ($self, $itemName) = @_; return if ! exists $self->{data}{$itemName}; my $item = $self->{data}{$itemName}; return if ! exists $item->{conversions}; return %{$item->{conversions}}; } #### some item: a source, eh another item: another source, eh one more item: another source, eh conversion 1 => value 1 conversion 2 => value 2 conversion 3 => value 3 conversion 4 => value 4 conversion 5 => value 5