in reply to shift, undef and 'or die'

As arturo is suggesting, it might be more prudent to check parameters using defined rather than simple boolean math. It is more practical, as well, since you can really go to town:
sub lookup { my $self = shift; my ($data_type,$item) = @_; warn "data_type not provided\n" unless (defined $data_type); warn "item not provided\n" unless (defined $item); # ... }