2008-12-23 16 views
35

Dada una estructura de datos (por ejemplo, un hash de hash), ¿cuál es la forma limpia/recomendada de hacer una copia profunda para uso inmediato? Supongamos casos razonables, donde los datos no son particularmente grandes, no existen ciclos complicados, y legibilidad/mantenibilidad/etc. son más importantes que la velocidad a toda costa.¿Cuál es la mejor manera de hacer una copia profunda de una estructura de datos en Perl?

sé que puedo usar Storable, Clone, Clon :: Más, Clone::Fast, Data::Dumper, etc. ¿Cuál es la mejor práctica actual?

+0

Es [tag: deep-copia] realmente irrelevante, @JasonMArcher? El resumen habla sobre C y C++, pero la copia superficial y profunda son conceptos independientes del lenguaje. Por un clon, por lo general se entiende copia superficial (Java, C#, ...), esta pregunta es una copia profunda. – Palec

+0

Nuestras etiquetas no necesitan entrar en minucias. Estos son todo tipo de operaciones de clonación. Actualmente tenemos [clon], [clonación], [copia], [deepclone], [deep-clone], [deep] + [clone], [deep] + [copy] y [deep-copy]. – JasonMArcher

Respuesta

17

Clone es mucho más rápido que Storable::dclone, pero este último es compatible con más tipos de datos.

Clone::Fast y Clone::More son más o menos equivalentes si la memoria no me falla, pero menos completo de características que incluso clonar y Scalar::Util::Clone soporta incluso menos, pero IIRC es el más rápido de todos ellos para algunas estructuras.

Con respecto a la legibilidad todos éstos deben funcionar de la misma, que son prácticamente intercambiables.

Si no tiene necesidades específicas de rendimiento me acaba de utilizar dclone de almacenable.

No utilizaría Data::Dumper para esto simplemente porque es tan engorroso y tortuoso. Probablemente va a ser muy lento también.

Por lo que vale la pena, si alguna vez quiere la clonación personalizable, entonces Data::Visitor proporciona capacidades de enganche y bastante característica completa la clonación profunda es el comportamiento predeterminado.

+1

¿Tiene un enlace a Scalar :: Util :: Clone? No puedo encontrarlo ni en CPAN ni en Metacpan ... –

15

Mi impresión es que Storable::dclone() es algo canónico.

7

Clone es probablemente lo que necesita para eso. Al menos, eso es lo que usa todo el código que he visto.

Cuestiones relacionadas