Perl - Как получить доступ и массив элемента, который содержится в другом массиве - PullRequest
1 голос
/ 25 апреля 2009

Хейло снова,

Я пытался упростить поддержку моей программы. У меня есть массив, который я объявляю:

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

Затем я помещаю этот массив @Pizza в другой массив, например:

my @food = (\@pizza);

Когда я пытаюсь получить доступ к $ p1 или $ p2 через свойство @food, я получаю возвращаемое значение типа «Массив {0x8001}», которое выглядит как ссылка на память. Я попробовал вот что:

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

Какой самый правильный способ получить к этому доступ? Я ищу НЕ использовать индексы для облегчения чтения программы. не могли бы вы, ребята, указать мне правильное направление?

С уважением,


Вот что я пытаюсь сделать:

У меня есть несколько баз данных (для примера, это пример)

База данных одна
Таблица первая (D1T1) | Колонка первая | Колонка вторая | Колонка третья | Колонка четвертая
Таблица вторая (D1T2) | Колонка первая | Колонка вторая | Колонка третья

База данных Два
Таблица первая (D2T1) | Колонка первая | Колонка вторая | Колонка третья
Таблица 2 (D2T2) | Колонка первая | Колонка вторая | Колонка третья
Таблица третья (D2T2) | Колонка первая | Колонка вторая | Колонка третья

Между этими двумя базами данных есть информация, относящаяся к конкретным записям прямо в них обеих. То, что я пытаюсь сделать, это создать массив (каждый массив будет представлять базу данных) и вставить переменные (каждая переменная будет представлять собой table.field. Внутри источника данных) После того, как я сделал это, я создаю массив для хранения всех массивов (Те, которые представляют БД), так как этот массив будет представлять одну запись прямо в двух базах данных, по которым я затем смогу действовать. Пример:

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

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

Если я хочу знать, что было в Базе данных 2 -> Таблица 2 -> Столбец 4, каким было бы утверждение? Должен ли я вместо этого использовать хеши? У меня есть требование для этого двумерного массива / хеша.

Любая помощь очень ценится.

MC

Ответы [ 2 ]

10 голосов
/ 26 апреля 2009

Не зная, что вы пытаетесь достичь, какие данные вы моделируете, все, что я могу вам помочь, это путаница с синтаксисом. Здесь есть путаница в нескольких моментах.

# 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 -> Таблица 2 -> Столбец 4, каким будет утверждение?»

Не используйте цифры. Назовите их, потому что я уверен, что у них есть имена. Так что да, вы хотите хэши. Допустим, база данных Foo -> Table Bar -> Column Baz. Вы получите доступ к этому как ...

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

или длинная рука

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

Где $values может быть ссылкой на массив всех значений Foo.Bar.Baz или другого хеша, ключом которого является первичный ключ Foo.Bar. То, что имеет больше смысла, зависит от того, что вы делаете с данными.

Я предоставлю вам возможность адаптировать ответ Чаза для создания хешей вместо массивов.

Конечно, я должен спросить, зачем выгружать все обе базы данных в большую структуру в памяти, а затем работать над ней? Если у вас есть базы данных, запросите их. Это будет быстрее и гибче.

Мы вернулись к этому основному вопросу; что ты ДЕЙСТВИТЕЛЬНО пытаешься сделать?

0 голосов
/ 26 апреля 2009

Исходя из того, что вы описали, звучит так, будто вам нужно что-то вроде этого:

#!/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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...