Data :: Printer是否处理数组切片?

时间:2016-09-28 14:26:45

标签: perl

显然不是:

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

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

返回

10

据我所知,documentation并未对此事发表任何看法。

问题

  • 为什么上面的代码不起作用?
  • 是否可以在不诉诸临时工作的情况下使其工作?

2 个答案:

答案 0 :(得分:13)

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]];

答案 1 :(得分:12)

Data :: Printer' s OutputStream需要一个变量,但数组切片不是变量。

选项1(差)

为切片的每个元素调用p

p

输出:

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

我说这很差,因为它没有显示偏移量,更重要的是,如果索引列表为空,它可能导致根本没有输出。

选项2(更好)

构建数组。

100
101
102
103
104
105
106
107
108
109

这比第一个选项产生更清晰的输出:

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