#!/usr/bin/perl use strict; use warnings; package Customer; use Moose; has 'name' => ( is => 'rw' ); has 'attributes' => ( is => 'rw', isa => 'ArrayRef' ); sub to_html_table { my $self = shift; my $o = '' . "\n" . '' . "\n"; $o .= '' . "\n" for @{$self->attributes}; $o .= '
' . $self->name . '
' . $_ . '
' . "\n" . "\n"; return $o; } package CustomerRecord; use Moose; has 'customers' => ( is => 'rw', isa => 'ArrayRef' ); sub add_customer { my $self = shift; push @{$self->{'customers'}}, shift @_ if @_; } sub to_html { my $self = shift; my $o; $o .= $_->to_html_table for @{$self->{'customers'}}; return $o; } sub find { my $self = shift; my ($i, $k) = @_; return $self->new( customers => [ grep { $_->{$i} eq $k } @{$self->customers} ] ); } sub sort_in_order { my $self = shift; my ($order, $key) = @_; die "unknown order for sort" unless $order eq 'asc' or $order eq 'desc'; return $self->new( customers => $order eq 'asc' ? [sort { $a->{$key} cmp $b->{$key} } @{$self->customers}] : [sort { $b->{$key} cmp $a->{$key} } @{$self->customers}] ); } package main; use YAML; use Data::Dumper; my $ref = [Load(<<'...')]; --- Kundenname: Meyer Datensatz: - DatensatzA 1 - DatensatzA 2 - DatensatzA 3 - DatensatzA 4 - DatensatzA 5 - DatensatzA 6 --- Kundenname: Müller Datensatz: - DatensatzB 1 - DatensatzB 2 - DatensatzB 3 --- Kundenname: Schulze Datensatz: - DatensatzC 1 - DatensatzC 2 - DatensatzC 3 - DatensatzC 4 - DatensatzC 5 - DatensatzC 6 - DatensatzC 7 ... #print Dumper($ref); my $record = CustomerRecord->new; $record->add_customer( Customer->new( name => $_->{'Kundenname'}, attributes => $_->{'Datensatz'} ) ) for @$ref; print $record->to_html; # dump all as html print $record->find(name => 'Müller')->to_html; # dump result as html print Dump($record->find(name => 'Müller')); # dump to yaml print Dumper Load (Dump($record->find(name => 'Müller'))); # load from yaml print Dumper $record->sort_in_order( desc => 'name' ); # dump descending