代码之家  ›  专栏  ›  技术社区  ›  Yevgeny Simkin

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

  •  1
  • Yevgeny Simkin  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  6
  •   Cameron    14 年前

    尝试使用 @{$_}

    foreach (@twoDimenArray) {
        my ($item1, $item2, $item3) = @{$_};    # $_ is an array
    }
    
        2
  •  4
  •   Jonathan Leffler    14 年前

    你所拥有的对我有用-也就是说,这个打印“foo bar”:

    use strict;
    use warnings;
    
    my @a = ("foo","bar");
    my ($item1, $item2) = @a;
    
    print "$item1 $item2\n";
    


    此代码实现二维数组:

    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";
    

    输出为'two ARRAY refs':

    ARRAY(0x100803068) ARRAY(0x100826770)
    


    实施你的 foreach 回路:

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

    a00 a01
    a10 a11
    

    这段代码是DBD::Informix发行版的一个示例—上一次修改是在2002年。它使用 fetchall_arrayref()

    #!/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] 参考文献-as ${$row}[0] .

        3
  •  0
  •   Daniel Holz    14 年前

    #!/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;