【问题标题】:Perl: Handling arrays and array referencesPerl:处理数组和数组引用
【发布时间】:2016-06-21 17:13:26
【问题描述】:

我是 Perl 新手,目前正在学习 Perl 如何处理多维数组以及如何访问元素。

在子程序中执行数据库查询,并返回数组@stash:

...
while ( $array_ref = $sth->fetchrow_arrayref ) {
        push @sub_stash, [ @$array_ref ];
    }

$dbh->disconnect;
return ( @sub_stash );

@stash 在 main 中接收,并管理打印数组的内容如下:

@stash = query($var);

### Dump the stash contents!
foreach my $array_ref ( @stash ) {
    print "@$array_ref\n";
} 

屏幕输出示例如下:

bash-3.2$ ./test_db_array.pl
2007 123 200728 200753 26
2008 256 200800 200852 53
2009 256 200900 200952 53
2010 258 201001 201052 52
2011 257 201101 201152 52
2012 256 201201 201253 53
2013 255 201300 201352 53
2014 254 201400 201452 53
2015 256 201500 201552 53
2016 116 201601 201624 24
bash-3.2$

@stash 是包含 10 行乘 5 列,还是包含 10 行乘 1 列(由一行文本组成)?我怎么能弄清楚呢?

在我的小程序开发中,我希望循环遍历年份列(数组的第一列),并打印年份。

如何访问特定元素,例如第 3 行 -- 第 4 列?

【问题讨论】:

  • 使用Data::Dumper检查数据结构。
  • 我不太明白你在问什么你 正在 访问所有元素——循环遍历顶级数组,并打印出以 refs 为元素的数组。与其简单地打印@$array_ref,不如在它上面运行一个循环,你会看到究竟是什么。你已经在你展示的代码中得到了一切,我建议你多玩一点。一个很好的资源是perldsc,当然还有perlreftutperlref
  • 除了上面的注释,你需要知道,做print "@array"会将@array的所有元素都转换成字符串。就像join(' ', @array)' ' 实际上是$" 的内容,但现在这并不重要)。所以它不是一个字符串,你只是通过你输出它的方式把它变成一个。您还可以在query 子中复制引用,因为my 前面没有$array_ref = $sth->fetchrow_arrayref,它重用相同的变量,然后用[ @$array_ref ] 取消引用并引用它。做my $respush @sub_stash, $res

标签: perl


【解决方案1】:

您的@stash 数组包含十个数组引用。每个引用的数组将包含五个元素(查询中的每一列中的一个)。

您可以使用Data::Dumper 验证这一点。

print Dumper(\@stash);

您可以使用两组数组查找括号来访问子数组的各个元素。

print $stash[0][0]; # prints 2007
print $stash[9][4]; # prints 24

或者您可以在循环中打印数组中的单个元素。

foreach my $array_ref ( @stash ) {
    print "$array_ref->[0]\n"; # prints the first element (i.e. the year)
} 

有关处理这些数据结构的更多详细信息,请参阅perllolperldsc

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 2016-02-25
    • 2018-06-29
    • 2016-06-06
    • 2012-05-10
    • 1970-01-01
    • 2016-07-08
    • 2012-09-21
    • 2014-10-29
    相关资源
    最近更新 更多