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
据我所知,这件事没有任何线索
问题
- 为什么上面的代码不起作用
- 有没有可能不用临时工就能让它工作
\[@$%&];%代码>,因此它将接受命名数组,但不接受任意列表或匿名数组引用
有一个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只接受变量,而不是[…]
之类的表达式。