Possible additional tweaks:
- There is no need to initialize %GeneCount to (). That is the value it takes on anyway when declared.
- You may want to cultivate the habit of using lexical variables as file handles (i.e. open my $genetype, ... or die ...). Bareword file handles are global.
- You may want to cultivate the habit of using three-argument opens (i.e. open my $genetype, '<', 'GeneType.txt' or die .... This is the only way you can specify things like file encoding.
- Purely as a style thing, built-ins like open() and split() do not need parentheses, except for precedence. Whoever wrote perlopentut uses parentheses because that author also chose to use the tightly-binding '||' operator rather than the loosely-binding or operator for error checking.
None of these are required to make the presented script work.