Perl:如何为数组中的undef元素分配一个公共值?

时间:2013-12-31 10:34:57

标签: 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(!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;
  }
}

我正在尝试将此代码简化为更简单但我无法在循环中动态使用变量名称p0_series,p1_seires。我试过像

for($a=0: $a <5; $a++ ){
if(!defined $p$i_series[$a] ) {
 #  assign values;
}
}

哪个不行。我是新来的perl任何帮助表示赞赏。 是否有可能以更简单的方式将null值分配给数组中的所有undef元素?

2 个答案:

答案 0 :(得分:4)

Perl没有null,但它有undef - 偶然是数组中未分配元素的默认值:

my @array = (undef, undef, 32, 54, undef, 59);

创建与:

相同的结构
my @array;
$array[2] = 32;
$array[3] = 54;
$array[5] = 59;

无需自己将其他字段分配给undef

如果您尝试为当前undef的元素分配默认值,您可以编写类似的内容(但请注意以下限制):

defined or $_ = "default" for @array;

在Perl 5.10或更高版本中,您可以使用// defined-or operator:

$_ //= "default" for @array

为多个阵列分配默认值:

$_ //= "default" for @array, @other_array

如果要将数组设置为特定长度,可以执行$#array = $length - 1,因此这实际上指定了最高索引。这将从较长的数组中删除条目。对于较短的数组,新创建的条目都是undef


这有一个小问题:Perl有两种​​undef

  • 标量可以包含值“undef”,如my $foo = undef

    如果我们像my @array = (undef, undef, 32, 54, undef, 59)一样初始化整个数组,就会出现这种情况。

  • 数组中的未分配值或散列共享undef标量,这是只读的。

    当我们通过仅指定一些索引来初始化数组时就是这种情况,例如$array[4] = 2

通常这没问题,但在for循环中,$_是当前标量的别名,在我们的例子中只能是readonly。因此,我们不能总是$_ //= "default" for @array,但必须:

  • 直接分配到数组元素,该元素在该插槽中创建可指定的标量:

    $array[$_] //= "default" for 0 .. $#array;
    

    对于多个阵列:

    for my $ref (\@array, \@other_array) {
      $ref->[$_] //= "default" for 0 .. $#$ref;
    }
    
  • 不要分配给元素并使用默认值创建数组的副本:

    @array = map { $_ // "default" } @array;
    

    对于多个阵列:

    @$_ = map { $_ // "default" } @$_ for \@array, \@other_array;
    

    虽然我认为这更优雅,但每次复制每个数组元素时都会遇到一些问题。

答案 1 :(得分:-2)

同意,但只是在perl中你也可以创建运行时变量名。与你的情况一样

if(!定义$ p $ i_series [$ a])

if(!defined $ {“p $ i”。“_ series”} [$ a])

这应该完成这项工作并创建变量$ p1_series [$ a],$ p2_series [$ a]以及