perl 如何获取数组中存在的子数组的值

8ehkhllq  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(180)

我已经创建了一个数组,并在每次循环迭代中将另一个数组推入其中。一旦完成,我想获取每个子数组和数组的值。
我正在使用的代码:

my $i;
my @carrierValuesAll="";

while (my @row = $sth->fetchrow_array()) {

    my @carrierValues=join(',', @row). "\n";
    push(@carrierValuesAll, @carrierValues);
}

$len = @carrierValuesAll;
for ($i = 0; $i < $len; $i = $i + 1) {
    print ("\@carrierValuesAll[$i] = $carrierValuesAll[$i]\n");
    print("\n");    
}

我得到的输出是:

@carrierValuesAll[1] = 1,1,https://au-sbc.trustidinc.com/tid,sbcLabStub,sbcLab,,SKY,0,2019-11-07 20:10:43,2021-07-02 04:39:43,TrustID Lab Oracle,Y,Y,Y,ivr.localdomain,Y,trustid

@carrierValuesAll[2] = 2,1,https://au-sbc.trustidinc.com/tid,sbcLab,sbcLab,,SKY,2,2019-11-07 20:10:43,2020-12-14 06:24:17,TrustID Lab Oracle,Y,Y,Y,ivr.localdomain,Y,admin

我尝试过的方法:

$len = @carrierValuesAll;
for ($i = 0; $i < $len; $i = $i + 1) {
    print ("\@carrierValuesAll[$i] = $carrierValuesAll[$i]\n");
    print("\n");    
    for (my $j=0;$j<$carrierValuesAll[$i];$j++) {
        print("\@carrierValuesAll[$j] = $carrierValuesAll[$j]\n");
        print("\n");
    }
}

添加了一个嵌套循环,但没有帮助。
这个输出是来自数据库的&我正试图将它存储在数组中。

bq9c1y66

bq9c1y661#

这里只有一个数组--当然还有第二个数组 variable,但其中只存储了一个标量值。
让我们看看您的代码:

my $i;
my @carrierValuesAll="";

声明$i的位置离它的使用位置太远,这有点像代码的味道。当然,它会工作得很好,但是Perl给了你在使用变量的位置声明变量的灵活性-所以使用它吧。
@carrierValuesAll=""并没有做你认为它在做的事情,我怀疑你认为它声明了一个空数组,但实际上它创建了一个包含一个空字符串元素的数组。

while (my @row = $sth->fetchrow_array()) {

    my @carrierValues=join(',', @row). "\n";
    push(@carrierValuesAll, @carrierValues);
}

现在你声明了一个新的数组@carrierValues,但是你给予了它一个从join()返回的值。join()的全部意义是取一个值列表(你在@row中的数据),并将其连接成一个字符串。然后你将这个字符串推到@carrierValuesAll的末尾。
join()的结果存储在数组中是没有意义的。join()的结果始终只是一个标量值。
所以当这个循环运行完之后,你就有了一个数组,@carrierValuesAll,它包含了数据库表中每一行的一个字符串,这里没有“子数组”,只有一个字符串数组。
然后通过打印@carrierValuesAll的内容来确认。

$len = @carrierValuesAll;
for ($i = 0; $i < $len; $i = $i + 1) {
    print ("\@carrierValuesAll[$i] = $carrierValuesAll[$i]\n");
    print("\n");    
}

这正是我所期望的,你从数据库中读取的数据用逗号分隔。
如果你不需要一个字符串,那么就不要用join()来生成一个字符串,而是取一个@row的副本,并在数组中存储一个对它的引用:

while (my @row = $sth->fetchrow_array()) {
    push(@carrierValuesAll, [ @row ]);
}

我不知道你想用你的数组数组做什么,但下面是你可以打印出来的方法:

$len = @carrierValuesAll;
for (my $i = 0; $i < $len; $i = $i + 1) {
    print ("\@carrierValuesAll[$i] = @{$carrierValuesAll[$i]}\n");
    print("\n");    
}

请注意,我已经使用@{$carrierValuesAll[$i]}对存储在$carrierValuesAll[$i]中的数组引用进行了解引用,并将其转换回一个数组,然后可以打印该数组。
还要注意,我已经将$i的声明移到了for循环中,在那里它更有意义。
但是大多数Perl程序员不会使用这种“C风格”的for循环,因为它看起来很糟糕,也很难理解。我会将代码写为:

for my $i (0 .. $#carrierValuesAll) {
    ...
}

我没有计算数组的长度,然后记住在到达之前停止一次迭代,我使用了特殊的变量$#ARRAY,它给了我数组中最后一个索引的索引。

相关问题