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

在Perl Catalyst中将哈希转换为数组,perl,data-structures,catalyst,perl-data-structures,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 =

我需要有关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\u INVOICE\u DETAILS变量的服务器日志时,我得到以下值:

API Response:$VAR1 = {
      'Product' => '34.04',
      'basetax' => '2.38',
      'vattax' => '4.36'
    };
将数据发送到第二个子例程后,第二个子例程变量的服务器日志中的数据如下所示:

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

有谁能帮助我如何将哈希数据从一个子例程发送到另一个子例程吗?

鉴于您的评论和您的来源:

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 $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\u customer\u 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
等等

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

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


带有
split
join
的行是可疑的。嗨,chorobra,请忽略split。join正在使用。我需要为现有数组分配另一个值作为10,以便使用join。但似乎join要对不正确的输出负责。好的,choroba,让我简单地解释一下,现在我有类似于此API的哈希数据ponse:$VAR1={'Product'=>'34.04','basetax'=>'2.38','vattax'=>'4.36'};现在我需要输出为API响应:$VAR1={34.04:2.38:4.36:10};但是这个转换过程应该由另一个子例程完成。Kay感谢Sobrique提供的解决方案,但这里还有一个问题,我需要用键发送值,因为在另一个子例程中,在接收这些值的地方,我需要用键和过程检查数据,然后最终输出应该是这样的。@JallipalliPhanindra我想不出为什么你真的需要发送一个数组而不是散列,而不是仅仅将散列转换为子例程的一部分……因为@Sobrique notes
values
将从散列结构“动态”创建一个值列表/数组,所以解决方案可能非常简单。
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