perl中的多维数组

时间:2014-03-16 22:22:34

标签: perl

我正在制作一个简短的脚本,其中两到三个变量相互链接。

Example:

my @batch;
my @case;
my @type = {
    back => "sticker",
    front => "no sticker",
    };
for (my $i=0; $i<$#batch; $i++{
  for (my $j=0; $j<$#batch; $j++{
    if ($batch[$i]=="health" && $case[$i]$j]=="pain"){
      $type[$i][$j]->back = "checked";
    }
  }
}

在这个简短的代码中,我想将@type用作$type[$i][$j]->back & $type[$i][$j]->front,但是我收到的错误是引用的数组未定义。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

Perl二维数组只是数组的数组:顶级数组的每个元素都包含(引用)另一个数组。最好的参考是perldoc perlreftut

根据我的理解,你需要一组哈希数组。 $type[$i][$j]->back$type[$i][$j]->front是Perl中的方法调用,您想要的是$type[$i][$j]{back}$type[$i][$j]{front}

use strict;
use warnings;

my @batch;
my @case;

# Populate @batch and @case

my @type;

for my $i (0 .. $#batch) {
  for my $j (0 .. $#{ $batch[$i] } ) {
    if ($batch[$i] eq 'health' and $case[$i][$j] eq 'pain') {
      $type[$i][$j]{back} = 'checked';
    }
  }
}

但我非常担心你的设计。 @type将包含未定义的元素,偶尔会将其设置为checked。正确的修复完全取决于您在构建它之后需要对@type执行的操作。

我希望这会有所帮助

答案 1 :(得分:0)

Perl没有多个维度变量。要模拟多维数组,可以使用所谓的references。引用是一种引用另一个Perl结构(如数组或散列)的内存位置的方法。

引用允许您构建更复杂的结构。例如,您可以拥有一个数组,而不是数组中的每个元素具有不同的值,它可以指向另一个数组。使用它,我可以将我的数组数组视为二维数组。 但它不是二维数组

在二维数组中,每列($j)具有相同的长度。这是有保证的。在Perl中,你拥有的是每一行($i),指向不同的列数组($j),并且每个列数组都可以有不同数量的元素(甚至没有所有!甚至可能都没有定义内部数组$j。)。

在那里,我必须检查每一列,看看它可能具有多少值:

for my $i ( 0..$#array ) {
    if ( ref $array[i] ne "ARRAY" ) {
       die qq(There is no sub array! for \$array[$i]!\n);
    }
    my @temp_j_array = @{ $array[$i] } {   # This is how you dereference a reference
    for my $j ( 0..$#temp_j_array ) {
       # Here be dragons...
    }
}

请注意,在我完成之前,我必须确切地看到内部($j)数组中有多少列。

顺便提一下,请注意我如何使用..索引我的数组。它比使用非常容易出错的三部分for循环更清晰。例如,您应该检查$i < $#array还是$ i&lt; = $#array`?看到区别?

由于你已经在处理一个非常复杂的结构(一个数组数组),我将使它变得更加复杂:(一个哈希数组的数组)。这种增加的复杂性使我能够摆脱三个独立的变量。我没有尝试让@batch @case@type保持彼此同步,而是可以将这些密钥设置为我最内部的哈希:

my @structure = ... # Some sort of structure...
for my $i ( 0..$#structure ) {
    my @temp = @{ $structure[$i] };   # This is a reference to an array. Dereference it.
    for my $j ( 0..$#temp ) {
        if ( $structure[$i]->[$j]->{batch} eq "health" 
                and $structure[$i]->[$j]->{case} eq "pain" ) {
                   $structure[$i]->[$j]->{back} = "checked";
        }
    }
}

这是使用Perl引用构建更复杂数据结构的一种非常常见的方法:

my %employees;   # Keyed by employee number:

$employees{1001}->{NAME} = "Bob";
$employees{1001}->{JOB}  = "Yes man";
$employees{1002}->{NAME} = "Susan";
$employees{1002}->{JOB}  = "sycophant";

你有一些语法错误,并使用了错误的布尔运算符(==)而不是(ne)。