Какой лучший способ сделать глубокую копию структуры данных в Perl? - PullRequest
36 голосов
/ 23 декабря 2008

Учитывая структуру данных (например, хэш хэшей), каков чистый / рекомендуемый способ сделать глубокую копию для немедленного использования? Предположим разумные случаи, когда данные не особенно велики, нет сложных циклов и читаемость / ремонтопригодность / и т.д. важнее скорости любой ценой.

Я знаю, что могу использовать Storable , Clone , Clone :: More, Clone :: Fast , Data :: Dumper и т.д. Какова текущая лучшая практика?

Ответы [ 4 ]

18 голосов
/ 24 декабря 2008

Clone намного быстрее, чем Storable::dclone, но последний поддерживает больше типов данных.

Clone::Fast и Clone::More в значительной степени эквивалентны, если память мне не изменяет, но менее полно, чем даже клон, а Scalar::Util::Clone поддерживает даже меньше, но IIRC - самый быстрый из них для некоторых структур.

Что касается читабельности, все они должны работать одинаково, они практически взаимозаменяемы.

Если у вас нет особых требований к производительности, я бы просто использовал Stocl's dclone.

Я бы не стал использовать Data::Dumper для этого просто потому, что он такой громоздкий и обходной. Вероятно, это будет очень медленно.

Для чего стоит, если вы когда-нибудь захотите настраиваемое клонирование, тогда Data::Visitor предоставляет возможности перехвата, и довольно полная функция глубокого клонирования является поведением по умолчанию.

15 голосов
/ 23 декабря 2008

У меня сложилось впечатление, что Storable::dclone() несколько канонично.

7 голосов
/ 23 декабря 2008

Клон , вероятно, то, что вы хотите для этого. По крайней мере, это то, что использует весь код, который я видел.

0 голосов
/ 01 февраля 2019

Попробуйте использовать fclone из Panda :: Lib , который кажется самым быстрым (написано в XS)

...