Perl:如何为数组中的未定义元素分配公共值?

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

我正在用类似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(!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:这是一个可怕的提示,建议使用糟糕的编程实践,使代码变得模糊,使其不易维护。您的“符号引用”也只适用于全局变量,这本身就是一个问题。我建议您阅读。他的解决方案:使用哈希(指数组引用)。