in case of failure, maybe $value contains chars like \ or + or the like which are interpolated on the fly. I don't like this standard behaviour of perl, because I prefer enabling special interpretation to disabling special interpretation, and I've seen many people fallen into this trap (included myself).
if ($ref->{prodname} =~ /\Q$value\E/ or $ref->{key1} =~ /\Q$value/ ) {
...
might work because \Q prevents interpolation of $variables in patterns until \E (see first pattern) which you can omit if it is at the end of the pattern (see second pattern)
I decided to use ... or ... instead of (...) || (...) because I think it is easier to read and you can omit a couple of paranteses. But this is just a matter of my personal taste :-) (Beware that || has a higher precedence than "or", so with || you need parantheses in this case...)
In your example, $ref->{prodname} will contain $value and perhaps some other stuff. If you want to check if $ref->{prodname} is exactly the same as $value, better use $ref->{prodname} eq $value, or if there are only numbers in both, $ref->{prodname} == $value.
Best regards,
perl -e "s>>*F>e=>y)\*martinF)stronat)=>print,print v8.8.8.32.11.32" |