Если использовать 5.10 или выше, я бы выбрал решение @ eugene. В противном случае ...
Для неверных значений (undef, '', 0) вы можете сделать
building => $p->{account}->{building} || -1
Для истинных значений вам придется проверить явно, возможно, с помощью регулярного выражения:
building => !($p->{account}->{building} =~ m/~|char2|char3/)
? $p->{account}->{building}
: -1
Объединение этих
building => $p->{account}->{building} || !($p->{account}->{building} =~
m/~|char2|char3/)
? $p->{account}->{building}
: -1
В качестве альтернативы, чтобы упростить это и упростить тестирование и повторное использование, вы можете извлечь эту логику в подпункт:
sub scrub {
my $value = shift;
if (!$value or $value =~ m/~|char2|char3/) {
return -1;
}
return $value;
}
А потом
my %profile = (
building => scrub( $p->{account}->{building} ),
email => scrub( $p->{account}->{email} ),
phone => scrub( $p->{account}->{phone} ),
);