Perl:如何为数组中的未定义元素分配公共值?
我正在用类似perl的语言构建五个数组(null、null、32、54、null、59)。所以我首先把我知道的值放在特定的索引中,然后用null填充其他值。我是这样做的Perl:如何为数组中的未定义元素分配公共值?,perl,Perl,我正在用类似perl的语言构建五个数组(null、null、32、54、null、59)。所以我首先把我知道的值放在特定的索引中,然后用null填充其他值。我是这样做的 my @p0_series, @p1_series; $p0_series[2] = "test"; $p1_series[3] = "string"; $p2_series[2] = "hello"; $p3_series[2] = "hi"; for($a = 0; $a < 5; $a++) { if(!defi
my @p0_series, @p1_series;
$p0_series[2] = "test";
$p1_series[3] = "string";
$p2_series[2] = "hello";
$p3_series[2] = "hi";
for($a = 0; $a < 5; $a++) {
if(!defined $p0_series[$a]) {
$p0_series[$a] = null;
}
if(!defined $p1_series[$a]) {
$p1_series[$a] = null;
}
if(!defined $p3_series[$a]) {
$p3_series[$a] = null;
}
if(!defined $p4_series[$a]) {
$p4_series[$a] = null;
}
if(!defined $p5_series[$a]) {
$p5_series[$a] = null;
}
}
my@p0\u系列、@p1\u系列;
$p0_系列[2]=“测试”;
$p1_系列[3]=“字符串”;
$p2_系列[2]=“你好”;
$p3_系列[2]=“hi”;
对于($a=0;$a<5;$a++){
如果(!定义的$p0_系列[$a]){
$p0_系列[$a]=null;
}
如果(!定义的$p1_系列[$a]){
$p1_系列[$a]=null;
}
如果(!定义的$p3_系列[$a]){
$p3_系列[$a]=null;
}
如果(!定义的$p4_系列[$a]){
$p4_系列[$a]=null;
}
如果(!定义的$p5_系列[$a]){
$p5_系列[$a]=null;
}
}
我试图将此代码简化为更简单的代码,但我无法在循环中动态使用变量名p0\u series,p1\u seires。我试着
for($a=0: $a <5; $a++ ){
if(!defined $p$i_series[$a] ) {
# assign values;
}
}
for($a=0:$aPerl没有null
,但它有undef
——这是数组中未赋值元素的默认值:
my @array = (undef, undef, 32, 54, undef, 59);
创建与以下内容相同的结构:
my @array;
$array[2] = 32;
$array[3] = 54;
$array[5] = 59;
无需将其他字段分配给您自己
如果您试图为当前未定义的元素指定默认值,则可以编写如下内容(但请注意以下限制):
在Perl 5.10或更高版本上,您可以使用定义的or运算符:
$_ //= "default" for @array
要为多个阵列指定默认值,请执行以下操作:
$_ //= "default" for @array, @other_array
for my $ref (\@array, \@other_array) {
$ref->[$_] //= "default" for 0 .. $#$ref;
}
@$_ = map { $_ // "default" } @$_ for \@array, \@other_array;
如果要将数组设置为特定长度,可以执行$#array=$length-1
,因此这实际上指定了最高索引。这将从较长数组中删除项。对于较短的数组,新创建的项都将取消定义
这有一个小问题:Perl有两种unde
:
- 标量可以包含值“undef”,如
my$foo=undef
如果我们像my@array=(undef,undef,32,54,undef,59)那样一次初始化整个数组,就会出现这种情况
- 数组或散列中的未赋值值共享其
undef
标量,标量为只读
当我们仅通过分配一些索引来初始化数组时就是这种情况,比如$array[4]=2
通常这是没有问题的,但在for循环中,$\uU//code>是当前标量的别名,在我们的例子中,当前标量可以是只读的。因此我们不能总是为@array
执行$\uU/=“default”,但必须:
- 直接分配到数组元素,该元素在该插槽中创建可分配的标量:
$array[$_] //= "default" for 0 .. $#array;
对于多个阵列:
$_ //= "default" for @array, @other_array
for my $ref (\@array, \@other_array) {
$ref->[$_] //= "default" for 0 .. $#$ref;
}
@$_ = map { $_ // "default" } @$_ for \@array, \@other_array;
- 不要指定给元素,而是使用默认值创建数组的副本:
@array = map { $_ // "default" } @array;
对于多个阵列:
$_ //= "default" for @array, @other_array
for my $ref (\@array, \@other_array) {
$ref->[$_] //= "default" for 0 .. $#$ref;
}
@$_ = map { $_ // "default" } @$_ for \@array, \@other_array;
虽然我认为这更优雅,但在复制每个数组元素时,可能会出现一些问题
同意,但在perl中,您也可以创建运行时变量名
如果(!定义的$p$i_系列[$a])
如果(!defined${“p$i”。_series”}[$a])
这将完成任务并创建变量$p1_series[$a]、$p2_series[$a]还有进一步的提示:
使用strict;在脚本顶部使用warnings
来获得关于脚本中一些问题的警告,这些问题我在回答中没有提到。很棒的提示。我的要求是未定义元素,我需要将其设为null。我必须将此数组元素馈送到highcharts,因此那里需要null。这正是我正在搜索。您好,我使用的是perl v5.10.1。我可以更改为单个数组,但如果更改为多个数组,我会收到错误“尝试在-line修改只读值”@SpreeTheGr8您可以显示不起作用的代码吗?您只能为@array
的$\u=1这样的变量指定默认值,而不能为1、2、3
的$\u=1这样的文本指定默认值。my@test;my@test2;$test[3]=“test”;$test2[2]='samp';$\u/='a'表示@test,@test2;@SpreeTheGr8谢谢,我用一个确定的解决方案进行了更新。此错误由以下方式触发:(a)未赋值数组值的表示方式和(b)for循环是如何工作的。非常微妙的东西,不是我最喜欢的Perl特性。-1:这是一个可怕的提示,建议使用糟糕的编程实践,使代码变得模糊,使其不易维护。您的“符号引用”也只适用于全局变量,这本身就是一个问题。我建议您阅读。他的解决方案:使用哈希(指数组引用)。