Perl - 如何访问和另一个数组中保存的数组元素

时间:2009-04-25 19:25:18

标签: perl multidimensional-array

Heylo,

我一直在尝试让我的程序更容易维护。我有一个我声明的数组:

my @pizza = ($p1 = "Pizza One", $p2 = "Pizza Two" );

然后我继续将这个@Pizza数组放在另一个数组中,如下所示:

my @food = (\@pizza);

当我尝试通过@food属性访问$ p1或$ p2时,我得到一个返回值,如“Array {0x8001}”,它似乎是一个内存引用。我试过的是这个:

$test = ${$food[$pizza[$p1]]};

访问此内容的正确方法是什么?我希望不使用索引,以简化程序的可读性。你们能指出我正确的方向吗?

此致


这就是我想要做的事情:

我有几个数据库(为了说明,这是一个例子)

数据库一 表一(D1T1)|第一栏|第二栏|第三栏|第四栏 表二(D1T2)|第一栏|第二栏|第三栏

数据库二 表一(D2T1)|第一栏|第二栏|第三栏 表二(D2T2)|第一栏|第二栏|第三栏 表三(D2T2)|第一栏|第二栏|第三栏

在这两个数据库之间,存在与它们之间的特定记录相关的信息。我想要做的是创建一个数组(每个数组将代表一个数据库)和插入变量(每个变量代表一个table.field。在数据源中)一旦我这样做,我创建一个数组来保存所有teh数组(代表数据库的那些)作为这个数组将代表两个数据库中的单个条目,然后我可以对其进行操作。示例:

@ D1 =(t1.col1,t1.col4,t2.col1); @ D2 =(t1.col1,t2.col1,t3.col2,t3.col3);

@rec =(\ @ D1,\ @ D2);

如果我想知道数据库2中的内容 - >表2 - >第4栏该声明是什么?我应该使用哈希吗?我确实需要这个二维数组/哈希。

非常感谢任何帮助。

MC

2 个答案:

答案 0 :(得分:10)

不知道你想要完成什么,你正在建模什么数据,我能帮你解决的是语法混乱。这里有几点困惑。

# You wrote
my @pizza = ($p1 = "Pizza One", $p2 = "Pizza Two" );

这不符合你的意思。它生成数组("Pizza One", "Pizza Two"),但它也将$p1设置为Pizza One,将$p2设置为Pizza Two。我想您正在尝试将Pizza One分配给密钥p1。我想你想使用一个哈希/关联数组:

# Try a hash
my %pizzas = (p1 => "Pizza One", p2 => "Pizza Two");

现在$pizzas{p1}Pizza One。或者,只需列出一个清单:

# An array
my @pizzas = ("Pizza One", "Pizza Two");

然后$pizzas[0]Pizza One。继续......

# You wrote
my @food = (\@pizza);

您正在尝试制作另一个列表,请参阅@pizza。以上内容使$food[0]引用@pizza,这不是您的意思。 Perl中的引用是标量,并且具有不同的语法。

# What you probably meant
my $food = \@pizza;

现在$food->[0]Pizza One$food->[0]Pizza Two

# You wrote
$test = ${$food[$pizza[$p1]]};

直到你得到输出才添加更多大括号。我建议你阅读Perl Data Structures Cookbook。哦,打开警告。在它们全部消失之前不要关闭它们并且不要将它们关闭,因为它们太多了。真。真的。

<强>更新

“我想知道数据库2中的内容 - &gt;表2 - &gt;第4列声明是什么?”

不要使用数字。给他们起名,因为我确定他们有名字。所以,是的,你想要哈希。那么让我们说数据库Foo - &gt;表格栏 - &gt;列Baz。你可以访问... ...

$values = $databases->{Foo}{Bar}{Baz};

或长手

$tables  = $databases->{Foo};
$columns = $tables->{Bar};
$values  = $columns->{Baz};

其中$values可以是Foo.Bar.Baz的所有值的数组引用,或者是由Foo.Bar的主键键入的另一个哈希值。哪个更有意义取决于你正在做什么来处理数据。

我会留给你来调整Chaz的答案来生成哈希而不是数组。

当然,我必须要问为什么要将整个两个数据库都转储到一个大的内存结构中然后再进行处理?如果您有数据库,请查询它们。它会更快,更灵活。

我们回到最基本的问题;你真的想做什么呢?

答案 1 :(得分:0)

基于你所描述的内容听起来像你需要这样的东西:

#!/usr/bin/perl

use strict;
use warnings;

my @dbs;
while (<DATA>) {
    chomp;
    if (/^Database/) {
        push @dbs, [];
        next;
    }
    my @table = split /\s*\|\s*/;
    push @{$dbs[-1]}, [ @table[1 .. $#table] ];
}

print "datbase 1, table 2, column 1: $dbs[0][1][0]\n";

for my $db (0 .. $#dbs) {
    for my $table (0 .. $#{$dbs[$db]}) {
        for my $col (0 .. $#{$dbs[$db][$table]}) {
            print "($db,  $table, $col) is $dbs[$db][$table][$col]\n";
        }
    }
}


__DATA__
Database One
Table One (D1T1) | D1T1C1 | D1T1C2 | D1T1C3 | D1T1C4
Table Two (D1T2) | D1T2C1 | D1T2C2 | D1T2C3

Database Two
Table One (D2T1)   | D2T1C1 | D2T1C2 | D2T1C3
Table Two (D2T2)   | D2T2C1 | D2T2C2 | D2T2C3
Table Three (D2T2) | D2T3C1 | D2T3C2 | D2T3C3