Once perl has used some system memory for something, you'll be damm lucky if you get it back for other processes to use until perl exits. undef'ing a variable will return the memory used by that variable to perl, so it won't need to eat any more memory the next time it needs some.
This is one of the reasons why eating a whole file into memory is a bad thing, even if you throw it away soon after doing so.
If avoiding memory bloat is important, then you'll need to design an algorithm which doesn't use much in memory storage. Working on small chunks of data and saving the results to a file, then at the end of your program taking the saved results and putting them together into your final answer. Also consider using DB_File, although remember that disk access is much slower then RAM access.