Perl - ошибка получения значений массива из массива, хранящегося в хеш-ссылке - PullRequest
1 голос
/ 20 октября 2019

Таким образом, в настоящее время я работаю над проектом perl, в котором мне нужно передать массив (содержащий идентификаторы для отклонения), хранящийся в виде ссылки на хэш, в другую подпрограмму, где я получаю доступ к массиву, использую его содержимое в файле json, который я создаю. В настоящее время я хочу, чтобы массив хранился как ссылка в моем основном хэше;«$ self», который я подбрасываю между подпрограммами для доступа к токену, который я использую для получения аутентификации. для сайта, над которым я работаю:

#!/usr/bin/perl -I/usr/local/lib/perl
#all appropriate libaries used

#I use this to gen. my generic user agent, which is passed around.
my $hub = website->new( email=>'XXXX', password=>'XXXX'); 

# I use this to get the authorisation token, which is stored as a hash ref for accessing where needed (sub not shown)
my $token = $hub->auth(); 

#this is where I get the array of ids I want to reject
my @reject_array = $hub->approvelist(); 

# this is where the issue is happening as the array hash ref keeps just giving a total number of id's 
$hub->rejectcontacts; 


sub approvelist{
    my $self = shift;
    #$self useragent  and the token gets used in a http request to get json

    .
    #json code here to strip out the id for each contact in a for loop, which I then push into the array below  \/
    .
    .
    .
    push @idlist, $id;
    .
    .
    .
    #this is where I try to store my array as a hash 
    $self->{reject_array} = @idlist; 

    ref in $self 

    return @idlist;
}

sub rejectcontacts{
    #I do the same trick to try getting the useragent obj, the auth. token AND now the array
    my $self = shift; 
    .
    #code used for the HTTP request here...
    .
    .

    my $content = encode_json({
        reason=>"Prospect title",
        itemIds=>[@{$self->{reject_array}}], #this is where the problem is
    });

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

Я проверил, что массив определен и сам хэш ref определен, но когда дело доходит до попытки доступа к массиву в моей подпункте "rejectcontacts"выше, все, что я получаю, это просто число идентификаторов в нем - 68 (число 68 помещается в файл json, который я пытаюсь записать, а затем, очевидно, не работает).

Любая помощь в этомс благодарностью - я не смог найти решение в другом месте.

1 Ответ

4 голосов
/ 20 октября 2019

Здесь:

$self->{reject_array} = @idlist;

Вы назначаете массив скаляру. Это приводит к тому, что вместо этого назначается длина массива. Проблема не появляется, пока вы не попытаетесь разыменовать скаляр, здесь:

itemIds => [@{$self->{reject_array}}]

Вы, вероятно, хотите:

$self->{reject_array} = \@idlist;

Также обратите внимание, что это:

itemIds => [@{$self->{reject_array}}]

Можно упростить как:

itemIds => $self->{reject_array}

Единственное отличие состоит в том, что это не копирует массив, но, насколько это касается, это не имеет значения в вашем коде,Это просто сделает его более эффективным.

Ссылка: perldata :

Если вы оцениваете массив в скалярном контексте, он возвращает длину массива.

...