Scroll to navigation

Clone::Choose(3pm) User Contributed Perl Documentation Clone::Choose(3pm)


Clone::Choose - Choose appropriate clone utility


  use Clone::Choose;
  my $data = {
      value => 42,
      href  => {
          set   => [ 'foo', 'bar' ],
          value => 'baz',
  my $cloned_data = clone $data;
  # it's also possible to use Clone::Choose and pass a clone preference
  use Clone::Choose qw(:Storable);


"Clone::Choose" checks several different modules which provides a "clone()" function and selects an appropriate one. The default preference is


This list might evolve in future. Please see "EXPORTS" how to pick a particular one.


"Clone::Choose" exports "clone()" by default.

One can explicitly import "clone" by using

  use Clone::Choose qw(clone);

or pick a particular "clone" implementation

  use Clone::Choose qw(:Storable clone);

The exported implementation is resolved dynamically, which means that any using module can either rely on the default backend preference or choose a particular one.

It is also possible to select a particular "clone" backend by setting the environment variable CLONE_CHOOSE_PREFERRED_BACKEND to your preferred backend.

This also means, an already chosen import can't be modified like

  use Clone::Choose qw(clone :Storable);

When one seriously needs different clone implementations, our recommended way to use them would be:

  use Clone::Choose (); # do not import
  my ($xs_clone, $st_clone);
  { local @Clone::Choose::BACKENDS = (Clone => "clone"); $xs_clone = Clone::Choose->can("clone"); }
  { local @Clone::Choose::BACKENDS = (Storable => "dclone"); $st_clone = Clone::Choose->can("clone"); }

Don't misinterpret recommended - modifying @Clone::Choose::BACKENDS has a lot of pitfalls and is unreliable beside such small examples. Do not hesitate open a request with an appropriate proposal for choosing implementations dynamically.

The use of @Clone::Choose::BACKENDS is discouraged and will be deprecated as soon as anyone provides a better idea.



"backend" tells the caller about the dynamic chosen backend:

  use Clone::Choose;
  say Clone::Choose->backend; # Clone

This method currently exists for debug purposes only.


"get_backends" returns a list of the currently supported backends.


  Jens Rehsack <rehsack at cpan dot org>
  Stefan Hermes <hermes at cpan dot org>


Please report any bugs or feature requests to "bug-Clone-Choose at", or through the web interface at <>. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.


You can find documentation for this module with the perldoc command.

  perldoc Clone::Choose

You can also look for information at:


  Copyright 2017 Jens Rehsack
  Copyright 2017 Stefan Hermes

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See for more information.


Clone, Clone::PP, Storable

2022-12-06 perl v5.36.0