如何访问二维Perl数组中的值,以便将它们放在标量变量中?

时间:2010-09-30 03:03:07

标签: arrays perl

我似乎记得(虽然现在找不到任何参考)能够做类似于

的事情
my @a = ("foo","bar");
my ($item1, $item2) = @a;

上面并没有按照我想要的那样做(显然),但我似乎记得有一些方法可以做到这一点,它会加载与括号列表中的标量顺序相关联的项目。

就此而言,我认为args数组是如何传递给子程序的,如...

sub method{
  my ($arg1, $arg2) = @_;
}

也许我只是想出去,但我认为这是可能的。

[编辑]

啊......基于第一个答案,我意识到它不起作用的原因是我使用的是二维数组。所以,在我的代码中它实际上看起来像这样:

foreach(@twoDimenArray){
    my ($item1, $item2, $item3) = $_; #$_ is an array
}

它一定是$语法搞砸了,但我已经尝试了($_) and @($_) and @$_,但这些都没有。

3 个答案:

答案 0 :(得分:6)

尝试使用@{$_}

foreach (@twoDimenArray) {
    my ($item1, $item2, $item3) = @{$_};    # $_ is an array
}

答案 1 :(得分:4)

你对我有用 - 也就是说,打印“foo bar”:

use strict;
use warnings;

my @a = ("foo","bar");
my ($item1, $item2) = @a;

print "$item1 $item2\n";

我碰巧在MacOS X 10.6.4上使用Perl 5.13.4,但我不认为这是一个重要因素;我希望任何Perl 5.x都能接受它。


此代码实现了一个2D数组:

use strict;
use warnings;

my @a;

$a[0][0] = "a00";
$a[0][1] = "a01";
$a[1][0] = "a10";
$a[1][1] = "a11";

my ($item1, $item2) = @a;

print "$item1 $item2\n";

输出为'两个ARRAY引用':

ARRAY(0x100803068) ARRAY(0x100826770)

副手,我不知道如何在一次操作中将数组数组扩展为4个单独的值。这与“无法做到”并不完全相同。


并实施foreach循环:

foreach my $array (@a)
{
    my($item1, $item2) = @$array;
    print "$item1 $item2\n";
}

打印:

a00 a01
a10 a11

此代码是DBD :: Informix发行版中的一个示例 - 最后一次修改于2002年。它使用fetchall_arrayref()方法返回数组引用数组,如问题的其中一条注释中所述。 / p>

#!/usr/bin/perl -w
#
# DBD::Informix Example 5 - fetchall_arrayref
#
# @(#)$Id: x05fetchall_arrayref.pl,v 100.1 2002/02/08 22:50:10 jleffler Exp $
#
# Copyright 1998 Jonathan Leffler
# Copyright 2000 Informix Software Inc
# Copyright 2002 IBM

use DBI;
printf("DEMO1 Sample DBD::Informix Program running.\n");
printf("Variant 4: using fetchall_arrayref()\n");
my($dbh) = DBI->connect("DBI:Informix:stores7") or die;
my($sth) = $dbh->prepare(q%
        SELECT fname, lname FROM customer WHERE lname < 'C'%) or die;
$sth->execute() or die;
my($ref) = $sth->fetchall_arrayref();
foreach $row (@$ref)
{
  printf("%s %s\n", $$row[0], $$row[1]);
}
undef $sth;
$dbh->disconnect();
printf("\nDEMO1 Sample Program over.\n\n");

如果我现在正在编写(或更新它),则会使用use strict;以及-w(相当于use warnings;)。它显示回到2002年(从那时起,AFAIK),你可以愉快地写@$ref。这些天,我可能会以$$row[0]的方式编写${$row}[0]个引用。

答案 2 :(得分:0)

对于数组引用数组:

#!/usr/bin/perl

use strict;
use warnings;

my @ary = ( [ qw( foo bar ) ], [ qw( one two ) ], );

my ($ary00, $ary01, $ary10, $ary11) = map { @{ $_ } } @ary;

对于任意嵌套的数组:

#!/usr/bin/perl

use strict;
use warnings;

my @ary = (
    [
        qw( foo bar ),
        [
            qw( BAZ QUUX )
        ],
    ],
    [
        qw( ten eleven ),
        [
            'one hundred and twenty',
            'one hundred and twenty-one',
            [
                'one thousand two hundred and twenty',
                'one thousand two hundred and twenty-one',
            ],
        ],
    ],
);

sub flatten {
    my @ary = @_;
    return map { ref($_) eq 'ARRAY' ? flatten( @{ $_ } ) : @{ $_ } } @ary;
}

my ( $a00, $a01, $a020, $a021, $a10, $a11, $a120, $a121, $a1220, $a1221 ) = flatten @a;