1

我是一个完全的 Perl 新手,但仍然无法相信我无法通过我在网上阅读的所有信息来弄清楚这一点,但是,我已经花费了太多时间并且此时正遭受阻塞。希望根据我的现实生活例子学到一些东西......

好的,我想我有一个数组数组,创建如下:

my @array1 = ();
my @array2 = ();
my $ctr1 = 0;
my $col;
[sql query]
while(($col)=$sth->fetchrow_array() ) {
  $array1[$ctr1]=$col;
  $ctr1++;
}

print STDERR "@array1";

##results in 10 rows, a mac address in each
##00:00:00:00:00:00 00:11:11:11:11:11 22:22:22:22:22:22 33:33:33:33:33:33 ... 

现在我做另一个查询。在遍历结果时,我正在寻找那 10 个 mac 地址。当我找到一个时,我在 array2 中添加一行,其中包含 mac 和累积到该点的序号,如下所示:

[sql query]
while(($col)=$sth->fetchrow_array() ) {
  $ctr2++;
  if( my ($matched) = grep $_ eq $col, @array1 ) {
    push( @array2, ($col,$ctr2) );
  }
}

print STDERR "@array2";

##results in 10 rows, a mac address and an integer in each
##00:00:00:00:00:00 2 00:11:11:11:11:11 24 22:22:22:22:22:22 69 33:33:33:33:33:33 82 ... 

现在是简单的部分。我想遍历array2,获取mac地址以用作sql查询的一部分。问题就在于此。我对自己在做什么一无所知,即使我几乎可以正常工作,但我无法回到那个时候。无知绝对不是幸福。

当我循环遍历 array2 时,我收到了许多错误,基于语句的不同形式。下面列出了我认为正确的一个以及错误消息...

my $ctr3 = 0;
foreach $ctr3 (@array2) {
  my $chkmac = $array2[$ctr3][0];    <--- gacks here with the error below - line 607
  [SQL query]


[Thu May 30 14:05:09 2013] [error] Can't use string ("00:66:55:77:99:88") as an ARRAY ref while "strict refs" in use at /path/to/test.cgi line 607.\n

我认为问题在于我的数组数组不是数组数组。如果是这样,它会像编码一样工作,或者我认为从阅读中......也就是说,我无法理解我在处理什么。我几乎可以肯定,这将是一个令人头疼的问题,但我被难住了.... 一点帮助,好吗?

蒂奥

4

3 回答 3

2

对于要使用数组引用的数组数组,例如

 push @array2, [$col, $ctr2];

在访问数组引用中的元素时,您需要使用->运算符。此外,当循环遍历一个数组时,没有必要重新索引到同一个数组。所以最后一部分看起来更像:

foreach $ctr3 (@array2) {
    my $chkmac = $ctr3->[0];
    ....
于 2013-05-30T17:56:32.057 回答
1

当你在那里做的foreach时候,$ctrl3不会有索引,它会有价值。所以你应该只需要做$ctrl3->[0]. 注意->which 取消引用数组引用(@array2实际上是数组引用的数组)。

编辑:正如 AKHolland 指出的那样,@array2实际上不是数组引用数组,尽管它应该是这样。您还需要更改:

push( @array2, ($col, $ctr2) );

push( @array2, [$col, $ctr2] );

这会产生一个数组引用,而不是一个列表。在这种情况下,列表只是折叠成常规参数push,这意味着您将两个单独的字符串推入@array2.

于 2013-05-30T17:55:14.273 回答
0

您的数组数组不是数组数组是正确的,因为在 Perl 中没有这样的东西。那你有什么?有两种查看方式。

首先,当您打印时@array2,您会得到一个由交替的 MAC 和计数组成的字符串,由空格分隔。由于空格表示数组元素之间的划分,我们可能会推测我们得到的是一个异构元素的单个数组,例如元素 0 是 MAC,元素 1 是计数,元素 2 是另一个 MAC , 等等。

另一个角度是看是如何@array2构造的:

push( @array2, ($col,$ctr2) );

的文档中push,我们发现push ARRAY LIST通过将元素附加LISTARRAY. 这具有将列表展平为数组的效果,从而丢失其作为列表的原始身份。你可以添加所有你想要的括号,当 Perl 需要一个列表时,它会将它们全部展平。

那么如何达到你想要的效果呢? List-of-Lists 文档有详细的处理,但简短的回答是您制作了一个数组引用列表。数组引用是标量,因此是数组中的合法元素。但他们保留他们的身份作为数组引用!

匿名数组引用构造函数是方括号[]。为了将包含元素的数组引用推$col送到$ctr2的末尾@array2,您只需执行以下操作:

push( @array2, [$col, $ctr2] );

您为访问 array-reference-in-an-array 的特定元素而编写的代码现在可以工作了。但是由于我已经写了很多关于这个主题的段落,让我最后解释一下最初的错误以及如何push突然改变陈述使其起作用。

有时写这个表达式$array2[$ctr3][0]$array2[$ctr3]->[0]为了澄清它实际上在做什么。它所做的是获取 的值$array2[$ctr3]并将其视为数组引用,取其 0 元素。如果我们认为$ctr30(因为它会在循环的顶部)的值$array2[$ctr3]是第一个元素,00:00:00:00:00:00. 当您随后要求 Perl 将00:00:00:00:00:00其视为数组引用时,Perl 会死掉,因为它不知道如何将字符串视为数组引用。

相反,当 的值$array2[$ctr3]是一个数组引用时,因为这是您@array2在构造它时推动的内容,Perl 能够按照您的要求做,取消引用数组引用并查看结果数组的元素 0,其值恰好是00:00:00:00:00:00.

于 2013-05-31T06:42:26.363 回答