Re: Traps for module writers [was: Re: anonymous proxy server in 100 lines of Perl]

Chaimf@cris.com
Mon, 25 Nov 1996 20:25:54 -0500 (EST)


Why not just a simple module to take care of the localization?

	use start_module;

All will be set to the defaults for the file.

	use start_module {$" => " ", ....}

Override the values as needed.

<chaim>

Gisle Aas wrote:
> 
> Randal Schwartz <merlyn@stonehenge.com> writes:
> > A properly written library is going to have to have:
> > 
> > 	eval {
> > 		local($SIG{__DIE__});
> > 		...;
> > 	}
> > 
> > and if you *don't* have that, *you* are asking for trouble, since the
> > user is free to write whatever they want as a die handler.
> 
> Yes, it is probably easier to do it like this than to tell people not
> to use $SIG{__DIE__} :-(
> 
> Perhaps we could have a "catch" keyword which worked like "eval" but
> localized $SIG{__DIE__} automatically?
> 
> I'll add it to my list of (silly) things that a module writer must
> care about:
> 
>    If you use something like "while (<>) {...}" in your library,
>    remember to localize $_ and ensure that $/ is what you
>    expect before the loop is entered. Something like this:
>       local($/, $_) = ("\n");
>    will probably do the trick.
> 
>    Never print anything before you set localized default values for:
>    $", $\, $#, $,:
>       local($", $\, $#, $,) = (" ", "", "%.15g", "");
> 
>    Always set $*=0 (or something you like) before you do any regexp
>    stuff that use ^ and/or $ (or always use /m or /s).
> 
>    Never trust perl to convert a string to a number unless you have
>    made sure that $# contains something sensible.
>       local($#) = ("%.15g");
> 
>    Localize $SIG{__DIE__} if you are going to use
>       eval {...die...}
>    as an exception mechanism.
> 
>    Don't use "multi-dimensional array emulation" (since perl5 has better
>    ways) which means we don't care about $; having a stupid value.
> 
>    There might be a problem with $^I too, but I am not sure.
> 
>    Fortunately Larry depreciated $[, so you don't have to care
>    about it any more.
> 
> Perhaps a list like this should go into perlmod(1) or perltrap(1).
> 
> Regards,
> Gisle
>