You really, really need strictures - always use strictures (use strict; use warnings; - see The strictures, according to Seuss). A quick glance through your code shows the following issues, at least some of which would be highlighted by 'strict':
- use == for numeric compare, not eq ($type eq 2)
- What is the scope of @char?
- Where does $x get a value?
- Use three parameter open and lexical file handles.
- What is $a = () supposed to do?
- Use Perl for loops rather than C for loops.
- Use sane and consistent indentation.
- Avoid global variables and side effects in functions (extract probably fails on both counts, but it's not clear from the calling code).
True laziness is hard work