我正在制作一个简短的脚本,其中两到三个变量相互链接。
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
,但是我收到的错误是引用的数组未定义。任何人都可以帮我解决这个问题吗?
答案 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)。