Что лучший способ состоит в том, чтобы глубоко скопировать хеш хешей в Perl? [дубликат]

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0" xmlns:mn="http://vsystems.com/WS/StockAdjustments">
    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes" />
    <xsl:template match="mn:StockAdjustments">
      <xsl:copy>
          <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="mn:StockAdjustment[@Status = ''][1]">
        <xsl:copy> 
            <xsl:if test="@Article">
                <xsl:attribute name="Article">
                    <xsl:value-of select="@Article"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Client">
                <xsl:attribute name="Client">
                    <xsl:value-of select="@Client"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Status">
                <xsl:attribute name="Status">
                    <xsl:value-of select="@Status"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Unit">
                <xsl:attribute name="Unit">
                    <xsl:value-of select="@Unit"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Status = ''">
                <xsl:attribute name="Quantity">
                    <xsl:value-of select="sum(//mn:StockAdjustment[@Status = '']/@Quantity)"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@ReasonCode">
                <xsl:attribute name="ReasonCode">
                    <xsl:value-of select="@ReasonCode"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Batch">
                <xsl:attribute name="Batch">
                    <xsl:value-of select="@Batch"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@HostLocation">
                <xsl:attribute name="HostLocation">
                    <xsl:value-of select="@HostLocation"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="mn:StockAdjustment[@Status = 'QUARANTAINE'][1]">
        <xsl:copy>
            <xsl:if test="@Article">
                <xsl:attribute name="Article">
                    <xsl:value-of select="@Article"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Client">
                <xsl:attribute name="Client">
                    <xsl:value-of select="@Client"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Status">
                <xsl:attribute name="Status">
                    <xsl:value-of select="@Status"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Unit">
                <xsl:attribute name="Unit">
                    <xsl:value-of select="@Unit"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Status = 'QUARANTAINE'">
                <xsl:attribute name="Quantity">
                    <xsl:value-of select="sum(//mn:StockAdjustment[@Status = 'QUARANTAINE']/@Quantity)"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@ReasonCode">
                <xsl:attribute name="ReasonCode">
                    <xsl:value-of select="@ReasonCode"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@Batch">
                <xsl:attribute name="Batch">
                    <xsl:value-of select="@Batch"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:if test="@HostLocation">
                <xsl:attribute name="HostLocation">
                    <xsl:value-of select="@HostLocation"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet> 
please check if it is suitable for you.
24
задан Community 23 May 2017 в 12:09
поделиться

4 ответа

use Storable qw(dclone);
$group2 = dclone(\%group);
36
ответ дан 28 November 2019 в 22:30
поделиться

Из документации Storable :: dclone я нашел Clone :

my $copy = clone (\@array);

# or

my %copy = %{ clone (\%hash) };

Не нуждается в гибкости и утверждает, что он быстрее, чем Storable :: dclone .

30
ответ дан 28 November 2019 в 22:30
поделиться

Глубокая структура данных 101:

  • Используйте Storable dclone, чтобы сделать глубокую копию структуры, и freeze и thaw чтобы сериализовать / десериализовать их для хранения (скажем, в базе данных или в файле cookie http (но вам следует зашифровать все, что вы отправляете пользователю, чтобы его было сложнее подделать).
  • Используйте Data :: Compare (или Test :: Deep или Test :: Differences внутри модульного теста) для сравнения двух глубоких структур данных.
  • Использовать Data :: Dumper или Data :: Dump при отладке, чтобы увидеть, как выглядят ваши объекты, но не используйте это как лицензию для вмешательства во внутренние объекты другого объекта; используйте API. :)
7
ответ дан 28 November 2019 в 22:30
поделиться

Всегда мог сохранить хеш через Storable или Data :: Dumper и переназначить сохраненное значение в новый хеш. Это должно получить полную копию без ведения ссылочных ссылок.

use Storable;
my $serialized = freeze \%config;
my %newconfig = %{ thaw($serialized) };
-3
ответ дан 28 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: