在Perl Catalyst中将哈希转换为数组

时间:2015-03-27 10:32:22

标签: perl data-structures catalyst perl-data-structures

我需要有关处理Perl变量的帮助。在这里,我将输入作为哈希。我现在需要将此哈希变量发送到另一个子例程。如何将数据作为参数传递给另一个子例程?下面的代码显示了我如何接近这个:

if ($csData->{'CUSTOMER_INVOICE_DETAILS'})
{
    $c->log->debug("API Response:". Dumper $csData->{'CUSTOMER_INVOICE_DETAILS'});
    my $Charges = [];
    my @customerCharges = $csData->{'CUSTOMER_INVOICE_DETAILS'};
    foreach(@customerCharges)
    {
        my ($customername,$customeramount) = split /:/;
        my $charge_hash = ({
        customername       => $customername,
        customeramount     => $customeramount
        });
        push(@$Charges, $charge_hash);
    }
my @ReturnCharges = $self->API->get_customer_charges($Charges, $Customer->customerid, $params->{'invoiceid'});

接收此数据的另一个子程序如下:

sub get_customer_charges
{
    my $self = shift;
    my ($charge, $CustomerId, $INID) = @_;

    my $http_request = {
            action       => 'GetTariff',
            customerid   => $CustomerId,
            csid         => $INID,  
            };
    my $markups = $self->APIRequest($http_request);

    ###Charge Level ID Inserting As 10
    my @ChargeLevels;
    my @BaseLevelID;
    foreach my $ch (@$charge)
    {
        my ($customername,$customeramount) = split(':', $ch->{'customername'}, $ch->{'customername'});
        my $chargelevel = join(':', $ch->{'customername'}, $ch->{'customeramount'}, '10');
        push(@BaseLevelID, $chargelevel);
    }
    push(@ChargeLevels, @BaseLevelID);
    return @ChargeLevels;
}

当我在服务器日志中打印CUSTOMER_INVOICE_DETAILS变量时,我得到以下值:

API Response:$VAR1 = {
      'Product' => '34.04',
      'basetax' => '2.38',
      'vattax' => '4.36'
    };

将数据发送到第二个子程序后,服务器日志中第二个子程序变量的数据如下:

Charges in API:$VAR1 = 'HASH(0xb75d6d8)::10';

任何人都可以帮助我如何将哈希数据从一个子程序发送到另一个子程序?

2 个答案:

答案 0 :(得分:1)

鉴于您的意见和来源是:

API Response:$VAR1 = {
      'Product' => '34.04',
      'basetax' => '2.38',
      'vattax' => '4.36'
    };

你正在寻找:

API Response:$VAR1 = { 34.04:2.38:4.36:10 };

(不知怎的,你得到了:

Charges in API:$VAR1 = 'HASH(0xb75d6d8)::10';

这表明此可能就像使用values系统调用一样简单。 values提取哈希值中所有值的数组。像这样的东西(猜测你的代码的哪一部分需要它)。

my @list_of_values = values ( %{$csData->{'CUSTOMER_INVOICE_DETAILS'}} ); 

答案 1 :(得分:1)

你说你想把一个哈希“转换”成一个数组,但你的问题似乎更复杂和微妙,所以简单的转换不太可能解决你的问题。当您的其余代码不希望它执行时,子例程中的某些内容将返回哈希引用。如果您传递的数据结构包含正确的信息但不包含您期望的表单,那么您可以更改代码以预期的形式生成它(例如return ARRAY)或更改您的子程序,以便它能够处理正确传递的数据。

至于“转换哈希”本身,如果您的数据结构不包含复杂的嵌套引用,而您想要做的就是将您的哈希“转换”为数组或列表,那么您可以简单地将哈希值分配给数组。也许我不理解你的问题,但如果你想要这种简单的“扁平化”,你可以试试:

my $customer_purchase = {
     'Product' => '34.04',
     'basetax' => '2.38',
     'vattax' => '4.36'
};

my @flat_customer_purchase = %{ $customer_purchase };
say "@flat_customer_purchase" ;

<强>输出:

basetax 2.38 Product 34.04 vattax 4.36

然后,您可以将哈希数据作为“数组”提供给第二个子例程。 例如@flat_customer_purchase视为列表:

use List::AllUtils ':all';
say join " ", pairkeys  @flat_customer_purchase
# basetax Product vattax
say join " ", pairvalues @flat_customer_purchase
# 2.38 34.04 4.36

注意:这假设由于某种原因您 必须 传递数组。运行pairvalues例程的示例只是复制@ Sobrique的建议,直接在你传递的哈希上使用values,但在我的回答中,它从数组中获取值对而不是哈希值。

我的感觉是问题还有更多。如果API Response是一个更复杂的哈希/对象,或者如果由于某些其他原因这个基本的perl不起作用,那么你将不得不提供更多信息。在决定如何处理它之前,您需要找出意外的哈希引用的来源。您可能会发现此SO讨论很有用: