You have the following:
$history{ $+{ ticket } }{ $entry->{ action } } = { date => $words[0], 'time' => $words[1], ( exists ( $+{ order } ) ? ( order => $+{ order } ) : () ), ( exists ( $+{ invoice } ) ? ( invoice => $+{ invoice } ) : () ), ( exists ( $+{ shipment } ) ? ( shipment => $+{ shipment } ) : () ), ( exists ( $+{ scheduled_date } ) ? ( scheduled_date => $+{ scheduled_date } ) : () ), ( exists ( $+{ status } ) ? ( status => $+{ status } ) : () ), };
That's a lot less readable than then following:
$history{ $+{ ticket } }{ $entry->{ action } } = { date => $words[0], time => $words[1], ( exists( $+{ order } ) ? order => $+{ order } : () ), ( exists( $+{ invoice } ) ? invoice => $+{ invoice } : () ), ( exists( $+{ shipment } ) ? shipment => $+{ shipment } : () ), ( exists( $+{ scheduled_date } ) ? scheduled_date => $+{ scheduled_date } : () ), ( exists( $+{ status } ) ? status => $+{ status } : () ), };
It can be further cleaned using a loop.
$history{ $+{ ticket } }{ $entry->{ action } } = { date => $words[0], time => $words[1], (\%+)->%{ grep exists( $+{ $_ } ), qw( order invoice shipment scheduled_date status ) } };
The mess can be hidden in a sub.
sub kv { my $h = shift; $h->%{ grep exists( $h->{ $_ } ), @_ } } kv( \%+, qw( ... ) )
We can simplify further if we don't need 100% equivalence.
If you don't care about undef fields, it simplifies to the following:
$history{ $+{ ticket } }{ $entry->{ action } } = { date => $words[0], time => $words[1], (\%+)->%{qw( order invoice shipment scheduled_date status )} };
If there are no extra captures (or you don't care if they end up as extra fields), it simplifies to the following:
$history{ $+{ ticket } }{ $entry->{ action } } = { date => $words[0], time => $words[1], %+, };
In reply to Re: Perl's hidden depths
by ikegami
in thread Perl's hidden depths
by talexb
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |