Perl Data::Printer是否处理阵列切片?

Perl Data::Printer是否处理阵列切片?,perl,Perl,显然不是: use strict; use warnings; use Data::Printer; my @values = 1 .. 99; p @values[0..9]; 返回 10 据我所知,这件事没有任何线索 问题 为什么上面的代码不起作用 有没有可能不用临时工就能让它工作 数据::打印机::p上的原型是\[@$%&];%,因此它将接受命名数组,但不接受任意列表或匿名数组引用 有一个Data::Printer::p_不带_原型函数将接受此输入,如果您使用导入Data::Pri

显然不是:

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

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

10
据我所知,这件事没有任何线索

问题
  • 为什么上面的代码不起作用
  • 有没有可能不用临时工就能让它工作

数据::打印机::p上的原型是
\[@$%&];%,因此它将接受命名数组,但不接受任意列表或匿名数组引用

有一个
Data::Printer::p_不带_原型
函数将接受此输入,如果您使用导入
Data::Printer

use Data::Printer use_prototypes => 0;
然后,当前包中的
p
将引用此函数,并接受您的输入

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

数据::打印机的
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] ];

@{[…]}
再次救援:)让我感到不安的是,即使是
p[…]
也不能工作,所以你可以做
p@a
而不是
p\@a
,D::p只接受变量,而不是
[…]
之类的表达式。