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: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |