My example was not a module, it was a script with an embedded package. package has a block scope, so to create a real module, only save the portion of the script that defines the package. The rest (including the %movies_data hash) belongs to the main package, i.e. to the script.
I prefer to constrain values. You can add any values you need, but checking they belong to a given set can still help you: it will catch typos in newly added data and provide a list of all possible values when you're not sure what category to use.
The same way as your code, i.e. there's no particular code related to the case (maybe because there's no such movie in the data?).
It's possible. It can take some time, but it isn't hard.
I haven't tested it, but I think so. I'm not aware of any 5.10+ features used in the code.