1

又是嘿嘿嘿

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

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

4

2 回答 2

10

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

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

那不符合你的意思。它创建了数组("Pizza One", "Pizza Two"),但它也设置$p1为 bePizza One$p2to be Pizza Two。我认为您正在尝试分配Pizza One给 key 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 中保存了什么 -> 表 2 -> 列 4 语句是什么?”

不要使用数字。给他们起名字,因为我确定他们有名字。所以是的,你想要哈希。因此,假设数据库 Foo -> 表格栏 -> 列 Baz。你会像这样访问它...

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

或长手

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

where$values可以是 Foo.Bar.Baz 的所有值的数组引用,也可以是 Foo.Bar 的主键作为键的另一个哈希。哪个更有意义取决于您对数据所做的工作。

我将留给您调整 Chaz 的答案以生成散列而不是数组。

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

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

于 2009-04-25T20:19:40.870 回答
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 
于 2009-04-25T22:42:33.837 回答