in reply to Shift function and file opening

my $file = shift || 'foo.html'; is equivalent to:
my $arg = shift; my $file; if ($arg) { $file = $arg; } else { $file = 'foo.html'; }
As mentioned, what the shift is doing depends on the context of your snippet in your program. If it appears within a sub block, then it is removing the first element of the argument list. If it is in the main body of your script, then it is removing the first element of @ARGV (which contain the arguments passed to your script from the command line).
--
bm