in reply to deleting key/value from hashref

foreach my $paymentRow ( @$payments ) { foreach my $salesKey ( keys %$sale_items ) { ### make sure we're applying the right line items ... next if ( $paymentRow->{creditacct} != $sale_items->{$salesKey}{debitacct} ); ## if payment can be applied, ## apply it and delete the row from payments/credits array warn "DELETING ... {$salesKey} " if ( $paymentRow->{amount} == $sale_items->{$salesKey}{amount} and $paymentRow->{ppid} == $sale_items->{$salesKey}{ppid} ); delete $sale_items->{$salesKey} <---- DELETED and undef( $paymentRow ) if ( $paymentRow->{amount} == $sale_items->{$salesKey}{amount} and $paymentRow->{ppid} == $sale_items->{$salesKey}{ppid} ); $sale_items->{$salesKey}{amount} -= $paymentRow->{amount} and undef( $paymentRow ) if ( $paymentRow->{amount} < $sale_items->{$salesKey}{amount} <---- AUTOVIVI and $paymentRow->{ppid} == $sale_items->{$salesKey}{ppid} ); } }

as demonstrated in

$salesKey = 'key'; $sales_items = { $salesKey => {} }; delete $sale_items->{$salesKey}; print("[", keys(%$sale_items), "]\n"); # [] doodah() if ( $paymentRow->{amount} < $sale_items->{$salesKey}{amount}); print("[", keys(%$sale_items), "]\n"); # [key]

To fix, change

delete $sale_items->{$salesKey} and undef( $paymentRow ) if ( $paymentRow->{amount} == $sale_items->{$salesKey}{amount} and $paymentRow->{ppid} == $sale_items->{$salesKey}{ppid} );

to

do { delete $sale_items->{$salesKey}; undef( $paymentRow ); next; } if ( $paymentRow->{amount} == $sale_items->{$salesKey}{amount} and $paymentRow->{ppid} == $sale_items->{$salesKey}{ppid} );

or start the last if with $sale_items->{$salesKey} and.

Replies are listed 'Best First'.
Re^2: deleting key/value from hashref
by geektron (Curate) on Sep 24, 2004 at 19:00 UTC
    i was using the  next at the beginning of the loop, which is what was throwing me off. thanks.