2015-03-27 3 views
1

Мне нужна помощь в обработке переменных Perl. Здесь я получаю ввод как хэш. Теперь мне нужно отправить эту переменную хэша в другую подпрограмму. Как передать данные в качестве аргумента другой подпрограмме? Приведенный ниже код показывает, как я приближаюсь это:Преобразование Hash To Array в Perl Catalyst

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'; 

Может ли кто-нибудь помочь, как я могу отправить данные хэша из одной подпрограммы в другую?

+1

строки с '' split' и join' являются подозрительными. – choroba

+0

Hi chorobra пожалуйста, игнорируйте split. И соединение используется. Мне нужно назначить другое значение как 10 для существующего массива, чтобы я использовал соединение. –

+0

Но, похоже, соединение отвечает за неправильный вывод. – choroba

ответ

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'}}); 
+0

Okay Спасибо Sobrique для решения, но вот еще одна проблема, которую мне нужно отправить значения с помощью ключей, потому что в другой подпрограмме, где эти значения получают там, мне нужно проверить с помощью ключей и процесса данные, а затем окончательный вывод должен быть таким, , –

+0

@JallipalliPhanindra Я не могу придумать, почему вам действительно нужно отправить массив вместо хэша вместо того, чтобы просто преобразовать хеш в качестве части вашей подпрограммы ... поскольку @Sobrique отмечает 'values' будет по существу создавать список/массив значений «на лету» из структуры хэша, поэтому решение может быть очень простым. –

1

Вы говорите, что вы хотите «преобразовать» хэш в массив, но ваш вопрос кажется более сложным и тонким настолько простое преобразование, вероятно, не то, что решит вашу проблему. Что-то в вашей подпрограмме возвращает хеш-ссылку, когда остальная часть вашего кода не ожидает, что она это сделает. Если передаваемая вами структура данных содержит правильную информацию, но не в ожидаемой форме, то вы можете либо изменить код, чтобы произвести его в ожидаемой форме (, например, до return), либо изменить свою подпрограмму так, чтобы она способен обрабатывать данные, которые он правильно передал.

Что касается «преобразования хэша» как такового, если ваша структура данных не содержит сложных вложенных ссылок, и все, что вы хотите сделать, это «преобразовать» ваш хэш в массив или список, тогда вы можете просто назначить хэш к массиву. Может быть, я не понимая ваш вопрос, но если такого рода просто «уплощение» все, что вы хотите, то вы можете попробовать:

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 

т.д.

NB: это предполагает, что по какой-то причине вы необходимо передать массив. Пример выполнения подпрограммы pairvalues просто реплицирует предложение @ Sobrique на использование values непосредственно на хеше, которое вы передаете, но в моем ответе он захватывает пары значений из массива вместо хэша.

Я считаю, что на вопрос больше. Если API Response является более сложным хеш-объектом или, если по какой-то другой причине этот базовый perl не работает, вам придется предоставить дополнительную информацию. Вам нужно выяснить, откуда приходит ваша неожиданная хеш-ссылка, прежде чем вы сможете решить, как ее обрабатывать. Вы могли бы найти это обсуждение так полезно: