Работает ли 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] ];