By altering a copy, you won't change the original. The perl program gets its environment and bits and settings from the invoking process, and that one (e.g. a root shell) won't change its mind just because perl is twiddling its own copy of the big picture. There are tricks to swap copy and original, but these involve changing system files. And even so, if you change things behind the back of the program which invoked perl, it just won't notice. For an effective and persistent change of umask usually a new process chain is necessary, starting with login(1).