найти длину вложенного массива в perl - PullRequest
0 голосов
/ 06 января 2020

У меня есть массив значений, как указано ниже -

"message": [
    {
      "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
      "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
      "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
     "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
     "abc": "",
      "xyz": "",
      "pqr": ""
    }
  ]

Чтобы найти его длину, я пытался выполнить следующие действия, но в каждом случае я получал ответ как «1» вместо «5».

1. say scalar @message;
2. my $attempt_length = @message;

Это может быть очень простой вопрос, но я застрял здесь очень сильно. Пожалуйста, помогите мне найти его длину в Perl, если кто-нибудь может. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 января 2020

Когда у вас есть ссылка на переменную вместо имени переменной, вы просто заменяете имя в синтаксисе, который вы хотите использовать, на блок, который оценивает ссылку.

Если у вас есть имя массив, вы использовали бы следующее, чтобы получить его размер:

@NAME             # In scalar context

Если у вас есть ссылка на массив, вы бы использовали следующее, чтобы получить его размер:

@BLOCK            # In scalar context

Итак, если $messages содержит ссылку на массив, его размер получится следующим:

@{ $messages }    # In scalar context

Вы можете опустить curlies, если они содержат простой скаляр ($NAME).

@$messages        # In scalar context

Итак,

use Cpanel::JSON::XS qw( decode_json );

my $json = do { local $/; <DATA> };
my $data = decode_json($json);
my $messages = $data->{message};
my $num_messages = @$messages;    # Or:  @{ $data->{message} }

__DATA__
{
  "message": [
    {
      "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
      "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
      "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
     "abc": "",
      "xyz": "",
      "pqr": ""
    },
    {
     "abc": "",
      "xyz": "",
      "pqr": ""
    }
  ]
}

См. Perl Синтаксис разыменования .

0 голосов
/ 08 января 2020

В дополнение к синтаксисам @$arrayref и @{ $arrayref }, уже упомянутым ikegami, я хочу упомянуть разыменование постфикса (доступно с perl v5.24 или с use experimental 'postderef' с perl v5.20)

my $num_of_elems = $arrayref->@*;         # implicit scalar context
my $num_of_elems = scalar $arrayref->@*;  # explicit scalar context
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...