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

1 perl multidimensional-array

Heylo,

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

my @pizza = ($p1 = "Pizza One", $p2 = "Pizza Two" );
Run Code Online (Sandbox Code Playgroud)

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

my @food = (\@pizza);
Run Code Online (Sandbox Code Playgroud)

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

$test = ${$food[$pizza[$p1]]};
Run Code Online (Sandbox Code Playgroud)

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

问候,


这就是我想要做的:

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

数据库一
表一(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

Sch*_*ern 10

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

# You wrote
my @pizza = ($p1 = "Pizza One", $p2 = "Pizza Two" );
Run Code Online (Sandbox Code Playgroud)

那不符合你的意思.它使阵列("Pizza One", "Pizza Two"),但它也将$p1Pizza One$p2Pizza Two.我想你正试图分配Pizza One钥匙p1.我想你想使用哈希/关联数组:

# Try a hash
my %pizzas = (p1 => "Pizza One", p2 => "Pizza Two");
Run Code Online (Sandbox Code Playgroud)

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

# An array
my @pizzas = ("Pizza One", "Pizza Two");
Run Code Online (Sandbox Code Playgroud)

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

# You wrote
my @food = (\@pizza);
Run Code Online (Sandbox Code Playgroud)

你正试图让另一个列表参考@pizza.上面$food[0]提到的@pizza不是你的意思.Perl中的引用是标量,并且具有不同的语法.

# What you probably meant
my $food = \@pizza;
Run Code Online (Sandbox Code Playgroud)

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

# You wrote
$test = ${$food[$pizza[$p1]]};
Run Code Online (Sandbox Code Playgroud)

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

更新

"我想知道数据库2中的内容 - >表2 - >第4列该声明是什么?"

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

$values = $databases->{Foo}{Bar}{Baz};
Run Code Online (Sandbox Code Playgroud)

或长手

$tables  = $databases->{Foo};
$columns = $tables->{Bar};
$values  = $columns->{Baz};
Run Code Online (Sandbox Code Playgroud)

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

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

当然,我必须要问为什么要将整个两个数据库转储到一个大的内存结构中,然后继续工作呢?如果您有数据库,请查询它们.它会更快,更灵活.

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