947 lines
22 KiB
HTML
947 lines
22 KiB
HTML
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<HTML><HEAD><TITLE>Man page of Try::Tiny</TITLE>
|
|
</HEAD><BODY>
|
|
<H1>Try::Tiny</H1>
|
|
Section: User Contributed Perl Documentation (3pm)<BR>Updated: 2017-12-21<BR><A HREF="#index">Index</A>
|
|
<A HREF="/cgi-bin/man/man2html">Return to Main Contents</A><HR>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<A NAME="lbAB"> </A>
|
|
<H2>NAME</H2>
|
|
|
|
Try::Tiny - Minimal try/catch with proper preservation of $@
|
|
<A NAME="lbAC"> </A>
|
|
<H2>VERSION</H2>
|
|
|
|
|
|
|
|
version 0.30
|
|
<A NAME="lbAD"> </A>
|
|
<H2>SYNOPSIS</H2>
|
|
|
|
|
|
|
|
You can use Try::Tiny's <TT>"try"</TT> and <TT>"catch"</TT> to expect and handle exceptional
|
|
conditions, avoiding quirks in Perl and common mistakes:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
# handle errors with a catch handler
|
|
try {
|
|
die "foo";
|
|
} catch {
|
|
warn "caught error: $_"; # not $@
|
|
};
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
You can also use it like a standalone <TT>"eval"</TT> to catch and ignore any error
|
|
conditions. Obviously, this is an extreme measure not to be undertaken
|
|
lightly:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
# just silence errors
|
|
try {
|
|
die "foo";
|
|
};
|
|
|
|
</PRE>
|
|
|
|
|
|
<A NAME="lbAE"> </A>
|
|
<H2>DESCRIPTION</H2>
|
|
|
|
|
|
|
|
This module provides bare bones <TT>"try"</TT>/<TT>"catch"</TT>/<TT>"finally"</TT> statements that are designed to
|
|
minimize common mistakes with eval blocks, and <FONT SIZE="-1">NOTHING</FONT> else.
|
|
<P>
|
|
|
|
This is unlike TryCatch which provides a nice syntax and avoids adding
|
|
another call stack layer, and supports calling <TT>"return"</TT> from the <TT>"try"</TT> block to
|
|
return from the parent subroutine. These extra features come at a cost of a few
|
|
dependencies, namely Devel::Declare and Scope::Upper which are
|
|
occasionally problematic, and the additional catch filtering uses Moose
|
|
type constraints which may not be desirable either.
|
|
<P>
|
|
|
|
The main focus of this module is to provide simple and reliable error handling
|
|
for those having a hard time installing TryCatch, but who still want to
|
|
write correct <TT>"eval"</TT> blocks without 5 lines of boilerplate each time.
|
|
<P>
|
|
|
|
It's designed to work as correctly as possible in light of the various
|
|
pathological edge cases (see ``<FONT SIZE="-1">BACKGROUND''</FONT>) and to be compatible with any style
|
|
of error values (simple strings, references, objects, overloaded objects, etc).
|
|
<P>
|
|
|
|
If the <TT>"try"</TT> block dies, it returns the value of the last statement executed in
|
|
the <TT>"catch"</TT> block, if there is one. Otherwise, it returns <TT>"undef"</TT> in scalar
|
|
context or the empty list in list context. The following examples all
|
|
assign <TT>"bar"</TT> to <TT>$x</TT>:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
my $x = try { die "foo" } catch { "bar" };
|
|
my $x = try { die "foo" } || "bar";
|
|
my $x = (try { die "foo" }) // "bar";
|
|
|
|
my $x = eval { die "foo" } || "bar";
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
You can add <TT>"finally"</TT> blocks, yielding the following:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
my $x;
|
|
try { die 'foo' } finally { $x = 'bar' };
|
|
try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' };
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
<TT>"finally"</TT> blocks are always executed making them suitable for cleanup code
|
|
which cannot be handled using local. You can add as many <TT>"finally"</TT> blocks to a
|
|
given <TT>"try"</TT> block as you like.
|
|
<P>
|
|
|
|
Note that adding a <TT>"finally"</TT> block without a preceding <TT>"catch"</TT> block
|
|
suppresses any errors. This behaviour is consistent with using a standalone
|
|
<TT>"eval"</TT>, but it is not consistent with <TT>"try"</TT>/<TT>"finally"</TT> patterns found in
|
|
other programming languages, such as Java, Python, Javascript or C#. If you
|
|
learnt the <TT>"try"</TT>/<TT>"finally"</TT> pattern from one of these languages, watch out for
|
|
this.
|
|
<A NAME="lbAF"> </A>
|
|
<H2>EXPORTS</H2>
|
|
|
|
|
|
|
|
All functions are exported by default using Exporter.
|
|
<P>
|
|
|
|
If you need to rename the <TT>"try"</TT>, <TT>"catch"</TT> or <TT>"finally"</TT> keyword consider using
|
|
Sub::Import to get Sub::Exporter's flexibility.
|
|
<DL COMPACT>
|
|
<DT id="1">try (&;@)<DD>
|
|
|
|
|
|
Takes one mandatory <TT>"try"</TT> subroutine, an optional <TT>"catch"</TT> subroutine and <TT>"finally"</TT>
|
|
subroutine.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
The mandatory subroutine is evaluated in the context of an <TT>"eval"</TT> block.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
If no error occurred the value from the first block is returned, preserving
|
|
list/scalar context.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
If there was an error and the second subroutine was given it will be invoked
|
|
with the error in <TT>$_</TT> (localized) and as that block's first and only
|
|
argument.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
<TT>$@</TT> does <B>not</B> contain the error. Inside the <TT>"catch"</TT> block it has the same
|
|
value it had before the <TT>"try"</TT> block was executed.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Note that the error may be false, but if that happens the <TT>"catch"</TT> block will
|
|
still be invoked.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Once all execution is finished then the <TT>"finally"</TT> block, if given, will execute.
|
|
<DT id="2">catch (&;@)<DD>
|
|
|
|
|
|
Intended to be used in the second argument position of <TT>"try"</TT>.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Returns a reference to the subroutine it was given but blessed as
|
|
<TT>"Try::Tiny::Catch"</TT> which allows try to decode correctly what to do
|
|
with this code reference.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
catch { ... }
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Inside the <TT>"catch"</TT> block the caught error is stored in <TT>$_</TT>, while previous
|
|
value of <TT>$@</TT> is still available for use. This value may or may not be
|
|
meaningful depending on what happened before the <TT>"try"</TT>, but it might be a good
|
|
idea to preserve it in an error stack.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
For code that captures <TT>$@</TT> when throwing new errors (i.e.
|
|
Class::Throwable), you'll need to do:
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
local $@ = $_;
|
|
|
|
</PRE>
|
|
|
|
|
|
<DT id="3">finally (&;@)<DD>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
try { ... }
|
|
catch { ... }
|
|
finally { ... };
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Or
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
try { ... }
|
|
finally { ... };
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Or even
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
try { ... }
|
|
finally { ... }
|
|
catch { ... };
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Intended to be the second or third element of <TT>"try"</TT>. <TT>"finally"</TT> blocks are always
|
|
executed in the event of a successful <TT>"try"</TT> or if <TT>"catch"</TT> is run. This allows
|
|
you to locate cleanup code which cannot be done via <TT>"local()"</TT> e.g. closing a file
|
|
handle.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
When invoked, the <TT>"finally"</TT> block is passed the error that was caught. If no
|
|
error was caught, it is passed nothing. (Note that the <TT>"finally"</TT> block does not
|
|
localize <TT>$_</TT> with the error, since unlike in a <TT>"catch"</TT> block, there is no way
|
|
to know if <TT>"$_ == undef"</TT> implies that there were no errors.) In other words,
|
|
the following code does just what you would expect:
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
try {
|
|
die_sometimes();
|
|
} catch {
|
|
# ...code run in case of error
|
|
} finally {
|
|
if (@_) {
|
|
print "The try block died with: @_\n";
|
|
} else {
|
|
print "The try block ran without error.\n";
|
|
}
|
|
};
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
<B>You must always do your own error handling in the </B>"finally"<B> block</B>. <TT>"Try::Tiny"</TT> will
|
|
not do anything about handling possible errors coming from code located in these
|
|
blocks.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Furthermore <B>exceptions in </B>"finally"<B> blocks are not trappable and are unable
|
|
to influence the execution of your program</B>. This is due to limitation of
|
|
<TT>"DESTROY"</TT>-based scope guards, which <TT>"finally"</TT> is implemented on top of. This
|
|
may change in a future version of Try::Tiny.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
In the same way <TT>"catch()"</TT> blesses the code reference this subroutine does the same
|
|
except it bless them as <TT>"Try::Tiny::Finally"</TT>.
|
|
</DL>
|
|
<A NAME="lbAG"> </A>
|
|
<H2>BACKGROUND</H2>
|
|
|
|
|
|
|
|
There are a number of issues with <TT>"eval"</TT>.
|
|
<A NAME="lbAH"> </A>
|
|
<H3>Clobbering $@</H3>
|
|
|
|
|
|
|
|
When you run an <TT>"eval"</TT> block and it succeeds, <TT>$@</TT> will be cleared, potentially
|
|
clobbering an error that is currently being caught.
|
|
<P>
|
|
|
|
This causes action at a distance, clearing previous errors your caller may have
|
|
not yet handled.
|
|
<P>
|
|
|
|
<TT>$@</TT> must be properly localized before invoking <TT>"eval"</TT> in order to avoid this
|
|
issue.
|
|
<P>
|
|
|
|
More specifically,
|
|
before Perl version 5.14.0
|
|
<TT>$@</TT> was clobbered at the beginning of the <TT>"eval"</TT>, which
|
|
also made it impossible to capture the previous error before you die (for
|
|
instance when making exception objects with error stacks).
|
|
<P>
|
|
|
|
For this reason <TT>"try"</TT> will actually set <TT>$@</TT> to its previous value (the one
|
|
available before entering the <TT>"try"</TT> block) in the beginning of the <TT>"eval"</TT>
|
|
block.
|
|
<A NAME="lbAI"> </A>
|
|
<H3>Localizing $@ silently masks errors</H3>
|
|
|
|
|
|
|
|
Inside an <TT>"eval"</TT> block, <TT>"die"</TT> behaves sort of like:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
sub die {
|
|
$@ = $_[0];
|
|
return_undef_from_eval();
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
This means that if you were polite and localized <TT>$@</TT> you can't die in that
|
|
scope, or your error will be discarded (printing ``Something's wrong'' instead).
|
|
<P>
|
|
|
|
The workaround is very ugly:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
my $error = do {
|
|
local $@;
|
|
eval { ... };
|
|
$@;
|
|
};
|
|
|
|
...
|
|
die $error;
|
|
|
|
</PRE>
|
|
|
|
|
|
<A NAME="lbAJ"> </A>
|
|
<H3>$@ might not be a true value</H3>
|
|
|
|
|
|
|
|
This code is wrong:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
if ( $@ ) {
|
|
...
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
because due to the previous caveats it may have been unset.
|
|
<P>
|
|
|
|
<TT>$@</TT> could also be an overloaded error object that evaluates to false, but
|
|
that's asking for trouble anyway.
|
|
<P>
|
|
|
|
The classic failure mode (fixed in Perl 5.14.0) is:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
sub Object::DESTROY {
|
|
eval { ... }
|
|
}
|
|
|
|
eval {
|
|
my $obj = Object->new;
|
|
|
|
die "foo";
|
|
};
|
|
|
|
if ( $@ ) {
|
|
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
In this case since <TT>"Object::DESTROY"</TT> is not localizing <TT>$@</TT> but still uses
|
|
<TT>"eval"</TT>, it will set <TT>$@</TT> to <TT>""</TT>.
|
|
<P>
|
|
|
|
The destructor is called when the stack is unwound, after <TT>"die"</TT> sets <TT>$@</TT> to
|
|
<TT>"foo at Foo.pm line 42\n"</TT>, so by the time <TT>"if ( $@ )"</TT> is evaluated it has
|
|
been cleared by <TT>"eval"</TT> in the destructor.
|
|
<P>
|
|
|
|
The workaround for this is even uglier than the previous ones. Even though we
|
|
can't save the value of <TT>$@</TT> from code that doesn't localize, we can at least
|
|
be sure the <TT>"eval"</TT> was aborted due to an error:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
my $failed = not eval {
|
|
...
|
|
|
|
return 1;
|
|
};
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
This is because an <TT>"eval"</TT> that caught a <TT>"die"</TT> will always return a false
|
|
value.
|
|
<A NAME="lbAK"> </A>
|
|
<H2>ALTERNATE SYNTAX</H2>
|
|
|
|
|
|
|
|
Using Perl 5.10 you can use ``Switch statements'' in perlsyn (but please don't,
|
|
because that syntax has since been deprecated because there was too much
|
|
unexpected magical behaviour).
|
|
<P>
|
|
|
|
The <TT>"catch"</TT> block is invoked in a topicalizer context (like a <TT>"given"</TT> block),
|
|
but note that you can't return a useful value from <TT>"catch"</TT> using the <TT>"when"</TT>
|
|
blocks without an explicit <TT>"return"</TT>.
|
|
<P>
|
|
|
|
This is somewhat similar to Perl 6's <TT>"CATCH"</TT> blocks. You can use it to
|
|
concisely match errors:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
try {
|
|
require Foo;
|
|
} catch {
|
|
when (/^Can't locate .*?\.pm in \@INC/) { } # ignore
|
|
default { die $_ }
|
|
};
|
|
|
|
</PRE>
|
|
|
|
|
|
<A NAME="lbAL"> </A>
|
|
<H2>CAVEATS</H2>
|
|
|
|
|
|
|
|
<DL COMPACT>
|
|
<DT id="4">•<DD>
|
|
<TT>@_</TT> is not available within the <TT>"try"</TT> block, so you need to copy your
|
|
argument list. In case you want to work with argument values directly via <TT>@_</TT>
|
|
aliasing (i.e. allow <TT>"$_[1] = "foo""</TT>), you need to pass <TT>@_</TT> by reference:
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
sub foo {
|
|
my ( $self, @args ) = @_;
|
|
try { $self->bar(@args) }
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
or
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
sub bar_in_place {
|
|
my $self = shift;
|
|
my $args = \@_;
|
|
try { $_ = $self->bar($_) for @$args }
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
<DT id="5">•<DD>
|
|
<TT>"return"</TT> returns from the <TT>"try"</TT> block, not from the parent sub (note that
|
|
this is also how <TT>"eval"</TT> works, but not how TryCatch works):
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
sub parent_sub {
|
|
try {
|
|
die;
|
|
}
|
|
catch {
|
|
return;
|
|
};
|
|
|
|
say "this text WILL be displayed, even though an exception is thrown";
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Instead, you should capture the return value:
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
sub parent_sub {
|
|
my $success = try {
|
|
die;
|
|
1;
|
|
};
|
|
return unless $success;
|
|
|
|
say "This text WILL NEVER appear!";
|
|
}
|
|
# OR
|
|
sub parent_sub_with_catch {
|
|
my $success = try {
|
|
die;
|
|
1;
|
|
}
|
|
catch {
|
|
# do something with $_
|
|
return undef; #see note
|
|
};
|
|
return unless $success;
|
|
|
|
say "This text WILL NEVER appear!";
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Note that if you have a <TT>"catch"</TT> block, it must return <TT>"undef"</TT> for this to work,
|
|
since if a <TT>"catch"</TT> block exists, its return value is returned in place of <TT>"undef"</TT>
|
|
when an exception is thrown.
|
|
<DT id="6">•<DD>
|
|
<TT>"try"</TT> introduces another caller stack frame. Sub::Uplevel is not used. Carp
|
|
will not report this when using full stack traces, though, because
|
|
<TT>%Carp::Internal</TT> is used. This lack of magic is considered a feature.
|
|
<DT id="7">•<DD>
|
|
The value of <TT>$_</TT> in the <TT>"catch"</TT> block is not guaranteed to be the value of
|
|
the exception thrown (<TT>$@</TT>) in the <TT>"try"</TT> block. There is no safe way to
|
|
ensure this, since <TT>"eval"</TT> may be used unhygienically in destructors. The only
|
|
guarantee is that the <TT>"catch"</TT> will be called if an exception is thrown.
|
|
<DT id="8">•<DD>
|
|
The return value of the <TT>"catch"</TT> block is not ignored, so if testing the result
|
|
of the expression for truth on success, be sure to return a false value from
|
|
the <TT>"catch"</TT> block:
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
my $obj = try {
|
|
MightFail->new;
|
|
} catch {
|
|
...
|
|
|
|
return; # avoid returning a true value;
|
|
};
|
|
|
|
return unless $obj;
|
|
|
|
</PRE>
|
|
|
|
|
|
<DT id="9">•<DD>
|
|
<TT>$SIG{__DIE__}</TT> is still in effect.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Though it can be argued that <TT>$SIG{__DIE__}</TT> should be disabled inside of
|
|
<TT>"eval"</TT> blocks, since it isn't people have grown to rely on it. Therefore in
|
|
the interests of compatibility, <TT>"try"</TT> does not disable <TT>$SIG{__DIE__}</TT> for
|
|
the scope of the error throwing code.
|
|
<DT id="10">•<DD>
|
|
Lexical <TT>$_</TT> may override the one set by <TT>"catch"</TT>.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
For example Perl 5.10's <TT>"given"</TT> form uses a lexical <TT>$_</TT>, creating some
|
|
confusing behavior:
|
|
|
|
|
|
<P>
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
given ($foo) {
|
|
when (...) {
|
|
try {
|
|
...
|
|
} catch {
|
|
warn $_; # will print $foo, not the error
|
|
warn $_[0]; # instead, get the error like this
|
|
}
|
|
}
|
|
}
|
|
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
<P>
|
|
|
|
|
|
Note that this behavior was changed once again in
|
|
Perl5 version 18 <<A HREF="https://metacpan.org/module/perldelta#given-now-aliases-the-global-_">https://metacpan.org/module/perldelta#given-now-aliases-the-global-_</A>>.
|
|
However, since the entirety of lexical <TT>$_</TT> is now considered experimental
|
|
<BR> <<A HREF="https://metacpan.org/module/perldelta#Lexical-_-is-now-experimental">https://metacpan.org/module/perldelta#Lexical-_-is-now-experimental</A>>, it
|
|
is unclear whether the new version 18 behavior is final.
|
|
</DL>
|
|
<A NAME="lbAM"> </A>
|
|
<H2>SEE ALSO</H2>
|
|
|
|
|
|
|
|
<DL COMPACT>
|
|
<DT id="11">TryCatch<DD>
|
|
|
|
|
|
Much more feature complete, more convenient semantics, but at the cost of
|
|
implementation complexity.
|
|
<DT id="12">autodie<DD>
|
|
|
|
|
|
Automatic error throwing for builtin functions and more. Also designed to
|
|
work well with <TT>"given"</TT>/<TT>"when"</TT>.
|
|
<DT id="13">Throwable<DD>
|
|
|
|
|
|
A lightweight role for rolling your own exception classes.
|
|
<DT id="14">Error<DD>
|
|
|
|
|
|
Exception object implementation with a <TT>"try"</TT> statement. Does not localize
|
|
<TT>$@</TT>.
|
|
<DT id="15">Exception::Class::TryCatch<DD>
|
|
|
|
|
|
Provides a <TT>"catch"</TT> statement, but properly calling <TT>"eval"</TT> is your
|
|
responsibility.
|
|
|
|
|
|
<P>
|
|
|
|
|
|
The <TT>"try"</TT> keyword pushes <TT>$@</TT> onto an error stack, avoiding some of the
|
|
issues with <TT>$@</TT>, but you still need to localize to prevent clobbering.
|
|
</DL>
|
|
<A NAME="lbAN"> </A>
|
|
<H2>LIGHTNING TALK</H2>
|
|
|
|
|
|
|
|
I gave a lightning talk about this module, you can see the slides (Firefox
|
|
only):
|
|
<P>
|
|
|
|
<<A HREF="http://web.archive.org/web/20100628040134/http://nothingmuch.woobling.org/talks/takahashi.xul">http://web.archive.org/web/20100628040134/http://nothingmuch.woobling.org/talks/takahashi.xul</A>>
|
|
<P>
|
|
|
|
Or read the source:
|
|
<P>
|
|
|
|
<<A HREF="http://web.archive.org/web/20100305133605/http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml">http://web.archive.org/web/20100305133605/http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml</A>>
|
|
<A NAME="lbAO"> </A>
|
|
<H2>SUPPORT</H2>
|
|
|
|
|
|
|
|
Bugs may be submitted through the <FONT SIZE="-1">RT</FONT> bug tracker <<A HREF="https://rt.cpan.org/Public/Dist/Display.html?Name=Try-Tiny">https://rt.cpan.org/Public/Dist/Display.html?Name=Try-Tiny</A>>
|
|
(or <A HREF="mailto:bug-Try-Tiny@rt.cpan.org">bug-Try-Tiny@rt.cpan.org</A> <mailto:<A HREF="mailto:bug-Try-Tiny@rt.cpan.org">bug-Try-Tiny@rt.cpan.org</A>>).
|
|
<A NAME="lbAP"> </A>
|
|
<H2>AUTHORS</H2>
|
|
|
|
|
|
|
|
<DL COMPACT>
|
|
<DT id="16">•<DD>
|
|
יובל קוג'מן (Yuval Kogman) <<A HREF="mailto:nothingmuch@woobling.org">nothingmuch@woobling.org</A>>
|
|
<DT id="17">•<DD>
|
|
Jesse Luehrs <<A HREF="mailto:doy@tozt.net">doy@tozt.net</A>>
|
|
</DL>
|
|
<A NAME="lbAQ"> </A>
|
|
<H2>CONTRIBUTORS</H2>
|
|
|
|
|
|
|
|
<DL COMPACT>
|
|
<DT id="18">•<DD>
|
|
Karen Etheridge <<A HREF="mailto:ether@cpan.org">ether@cpan.org</A>>
|
|
<DT id="19">•<DD>
|
|
Peter Rabbitson <<A HREF="mailto:ribasushi@cpan.org">ribasushi@cpan.org</A>>
|
|
<DT id="20">•<DD>
|
|
Ricardo Signes <<A HREF="mailto:rjbs@cpan.org">rjbs@cpan.org</A>>
|
|
<DT id="21">•<DD>
|
|
Mark Fowler <<A HREF="mailto:mark@twoshortplanks.com">mark@twoshortplanks.com</A>>
|
|
<DT id="22">•<DD>
|
|
Graham Knop <<A HREF="mailto:haarg@haarg.org">haarg@haarg.org</A>>
|
|
<DT id="23">•<DD>
|
|
Lukas Mai <<A HREF="mailto:l.mai@web.de">l.mai@web.de</A>>
|
|
<DT id="24">•<DD>
|
|
Aristotle Pagaltzis <<A HREF="mailto:pagaltzis@gmx.de">pagaltzis@gmx.de</A>>
|
|
<DT id="25">•<DD>
|
|
Dagfinn Ilmari Mannsåker <<A HREF="mailto:ilmari@ilmari.org">ilmari@ilmari.org</A>>
|
|
<DT id="26">•<DD>
|
|
Paul Howarth <<A HREF="mailto:paul@city-fan.org">paul@city-fan.org</A>>
|
|
<DT id="27">•<DD>
|
|
Rudolf Leermakers <<A HREF="mailto:rudolf@hatsuseno.org">rudolf@hatsuseno.org</A>>
|
|
<DT id="28">•<DD>
|
|
anaxagoras <<A HREF="mailto:walkeraj@gmail.com">walkeraj@gmail.com</A>>
|
|
<DT id="29">•<DD>
|
|
awalker <<A HREF="mailto:awalker@sourcefire.com">awalker@sourcefire.com</A>>
|
|
<DT id="30">•<DD>
|
|
chromatic <<A HREF="mailto:chromatic@wgz.org">chromatic@wgz.org</A>>
|
|
<DT id="31">•<DD>
|
|
Alex <<A HREF="mailto:alex@koban">alex@koban</A>.(none)>
|
|
<DT id="32">•<DD>
|
|
cm-perl <<A HREF="mailto:cm-perl@users.noreply.github.com">cm-perl@users.noreply.github.com</A>>
|
|
<DT id="33">•<DD>
|
|
Andrew Yates <<A HREF="mailto:ayates@haddock.local">ayates@haddock.local</A>>
|
|
<DT id="34">•<DD>
|
|
David Lowe <<A HREF="mailto:davidl@lokku.com">davidl@lokku.com</A>>
|
|
<DT id="35">•<DD>
|
|
Glenn Fowler <<A HREF="mailto:cebjyre@cpan.org">cebjyre@cpan.org</A>>
|
|
<DT id="36">•<DD>
|
|
Hans Dieter Pearcey <<A HREF="mailto:hdp@weftsoar.net">hdp@weftsoar.net</A>>
|
|
<DT id="37">•<DD>
|
|
Jens Berthold <<A HREF="mailto:jens@jebecs.de">jens@jebecs.de</A>>
|
|
<DT id="38">•<DD>
|
|
Jonathan Yu <<A HREF="mailto:JAWNSY@cpan.org">JAWNSY@cpan.org</A>>
|
|
<DT id="39">•<DD>
|
|
Marc Mims <<A HREF="mailto:marc@questright.com">marc@questright.com</A>>
|
|
<DT id="40">•<DD>
|
|
Mark Stosberg <<A HREF="mailto:mark@stosberg.com">mark@stosberg.com</A>>
|
|
<DT id="41">•<DD>
|
|
Pali <<A HREF="mailto:pali@cpan.org">pali@cpan.org</A>>
|
|
</DL>
|
|
<A NAME="lbAR"> </A>
|
|
<H2>COPYRIGHT AND LICENCE</H2>
|
|
|
|
|
|
|
|
This software is Copyright (c) 2009 by יובל קוג'מן (Yuval Kogman).
|
|
<P>
|
|
|
|
This is free software, licensed under:
|
|
<P>
|
|
|
|
|
|
|
|
<PRE>
|
|
The MIT (X11) License
|
|
|
|
</PRE>
|
|
|
|
|
|
<P>
|
|
|
|
<HR>
|
|
<A NAME="index"> </A><H2>Index</H2>
|
|
<DL>
|
|
<DT id="42"><A HREF="#lbAB">NAME</A><DD>
|
|
<DT id="43"><A HREF="#lbAC">VERSION</A><DD>
|
|
<DT id="44"><A HREF="#lbAD">SYNOPSIS</A><DD>
|
|
<DT id="45"><A HREF="#lbAE">DESCRIPTION</A><DD>
|
|
<DT id="46"><A HREF="#lbAF">EXPORTS</A><DD>
|
|
<DT id="47"><A HREF="#lbAG">BACKGROUND</A><DD>
|
|
<DL>
|
|
<DT id="48"><A HREF="#lbAH">Clobbering $@</A><DD>
|
|
<DT id="49"><A HREF="#lbAI">Localizing $@ silently masks errors</A><DD>
|
|
<DT id="50"><A HREF="#lbAJ">$@ might not be a true value</A><DD>
|
|
</DL>
|
|
<DT id="51"><A HREF="#lbAK">ALTERNATE SYNTAX</A><DD>
|
|
<DT id="52"><A HREF="#lbAL">CAVEATS</A><DD>
|
|
<DT id="53"><A HREF="#lbAM">SEE ALSO</A><DD>
|
|
<DT id="54"><A HREF="#lbAN">LIGHTNING TALK</A><DD>
|
|
<DT id="55"><A HREF="#lbAO">SUPPORT</A><DD>
|
|
<DT id="56"><A HREF="#lbAP">AUTHORS</A><DD>
|
|
<DT id="57"><A HREF="#lbAQ">CONTRIBUTORS</A><DD>
|
|
<DT id="58"><A HREF="#lbAR">COPYRIGHT AND LICENCE</A><DD>
|
|
</DL>
|
|
<HR>
|
|
This document was created by
|
|
<A HREF="/cgi-bin/man/man2html">man2html</A>,
|
|
using the manual pages.<BR>
|
|
Time: 00:05:58 GMT, March 31, 2021
|
|
</BODY>
|
|
</HTML>
|