Clone-Closure
view release on metacpan or search on metacpan
lib/Clone/Closure.pm view on Meta::CPAN
Closures are cloned, unlike with L<Clone|Clone>. Closed-over lexicals
will be cloned if they were originally declared in a scope that could be
run more than once, and shared otherwise.
That is, in the example in the
L</SYNOPSIS>, $count is cloned as it is scoped to &count, which can run
many times with different $count variables; but $total is shared as it
is file-scoped, so there will only ever be one copy.
Generally speaking, C<clone> will produce what might have been another
copy of the closure, generated by the same means. However, see L</BUGS>
below.
=head2 Magic
The following types of magic are preserved:
=over 4
=item *
shared variables
Cloning a shared variable creates a new shared variable, but it is not
shared with any other threads yet. That is, the clone is only visible in
this thread and any threads you create later.
=item *
tied variables
The tied object will also be cloned.
=item *
C<qr//> compiled regexes
=item *
tainted values
Cloning a tainted value produces a tainted copy.
=item *
globs
Globs are not cloned. Cloning a glob returns the original glob.
=item *
weakrefs
Beware cloning weakrefs: cloning a reference also clones the object it
refers to, and if there are no strong refs to this new object it will
self-destruct before C<clone> returns. For example,
my $sv = 5;
my $ref = \$sv;
weaken $ref;
my $clone = clone $ref;
will result in $clone being C<undef>, as the new clone of $sv has no
(strong) referents. As weakrefs are normally used to break loops in
self-referential structures, this should not happen often.
=item *
custom magic (C<U>, C<u>, and C<~> magics)
These will be cloned, and if the magic has a C<mg_obj> that will be
cloned too. This is not necessarily the right thing to do, depending on
what the custom magic is being used for.
=item *
Boyer-Moore fast string search
=item *
vstring magic
=item *
UTF8 cache magic
These types of magic are not visible from Perl-space, and are used by
perl to optimize certain operations.
=back
All other types of magic are dropped when cloning, so for example
my $env = clone \%ENV;
will produce a normal hashref containing a copy of the environment.
=head1 BUGS
=head2 Loops
Loops are currently not correctly recognized as 'scopes that may run
more than once'. That is, given
my @subs;
for my $i (1..10) {
push @subs, sub { $i };
}
a clone of $subs[0] will B<share> $i, which is probably not what you
wanted. One possible workaround is to generate the closure in a sub,
with its own lexical; for example
my @subs;
sub make_closure {
# this is important, so we get a new lexical
my $i = shift;
( run in 0.461 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )