Как определить количество элементов в ссылке на массив? - PullRequest
12 голосов
/ 04 мая 2011

Вот ситуация, с которой я столкнулся ...

$perl_scalar = decode_json( encode ('utf8',$line));

decode_json возвращает ссылку.Я уверен, что это массив.Как мне найти размер $ perl_scalar ??Согласно документации Perl, на массивы ссылаются с помощью @name.Есть ли обходной путь?

Эта ссылка состоит из массива хэшей.Я хотел бы получить количество хешей.

Если я сделаю длину ($ perl_scalar), я получу некоторое число, которое не соответствует количеству элементов в массиве.

Ответы [ 4 ]

28 голосов
/ 04 мая 2011

Это будет:

scalar(@{$perl_scalar});

Вы можете получить дополнительную информацию от perlreftut .

Вы можете скопировать ваш ссылочный массив в обычный, например, так:

my @array = @{$perl_scalar};

Но перед этим вы должны проверить, действительно ли $perl_scalar ссылается на массив, с ref:

if (ref($perl_scalar) eq "ARRAY") {
  my @array = @{$perl_scalar};
  # ...
}

Обновление

Метод length нельзя использовать для вычисления длины массивов, он предназначен для получения длины строк.

3 голосов
/ 09 декабря 2015

Вы также можете использовать последний индекс массива для вычисления количества элементов в массиве.

my $length = $#{$perl_scalar} + 1;
2 голосов
/ 04 мая 2011

Вы можете увидеть всю структуру с помощью Data :: Dumper:

use Data::Dumper;
print Dumper $perl_scalar;

Data :: Dumper - это стандартный модуль, который устанавливается с Perl.Полный список всех стандартных прагматик и модулей см. perldoc perlmodlib.

1 голос
/ 05 мая 2011
$num_of_hashes = @{$perl_scalar};

Поскольку вы присваиваете скаляру, разыменованный массив оценивается в скалярном контексте по количеству элементов.

Если вам нужно форсировать скалярный контекст, делайте так, как говорит KARASZI, и используйтефункция scalar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...