Работает ли Data:: Printer с массивами массивов?

По-видимому, нет:

use strict;
use warnings;
use Data::Printer;

my @values = 1 .. 99;
p @values[0..9];

Возвращает

10

Документация не проливает свет на этот вопрос, насколько я могу судить.

Вопросы

  • Почему код не работает?
  • Можно ли заставить его работать, не прибегая к темпу?

Ответ 1

Прототипом на Data::Printer::p является \[@$%&];%, поэтому он будет принимать именованный массив, но не произвольный список или ссылку на анонимный массив.

Существует функция Data::Printer::p_without_prototypes, которая будет принимать этот вход, и если вы импортируете Data::Printer с помощью

use Data::Printer use_prototypes => 0;

то p в текущем пакете будет ссылаться на эту функцию и принять ваш ввод.

use Data::Printer use_prototypes => 0;
my @values = 1 .. 99;
p [@values[0..9]];

Ответ 2

Данные:: Принтер p ожидает единственную переменную, но срез массива не является переменной.

Вариант 1 (Плохой)

Вызовите p для каждого элемента среза.

use Data::Printer;
my @values = 100 .. 199;
p $_ for @values[0..9];

Вывод:

100
101
102
103
104
105
106
107
108
109

Я говорю, что это плохо, потому что оно не отображает смещения, и что более важно, это может привести к отсутствию вывода, если список индексов пуст.

Вариант 2 (лучше)

Постройте массив.

use Data::Printer;
my @values = 100 .. 199;
p @{ [ @values[0..9] ] };

Это дает более четкий результат, чем первый вариант:

[
    [0] 100,
    [1] 101,
    [2] 102,
    [3] 103,
    [4] 104,
    [5] 105,
    [6] 106,
    [7] 107,
    [8] 108,
    [9] 109
]

Если вы обнаружите, что это слишком сложно, вы можете переопределить прототип p и передать ссылку на массив.

use Data::Printer;
my @values = 1 .. 99;
&p( [ @values[0..9] ] );

Если вы в порядке, всегда передавая скаляр или ссылку (а не переменные) на p, вы можете использовать следующее:

use Data::Printer use_prototypes => 0;
my @values = 1 .. 99;
p [ @values[0..9] ];