1

ねえ、また、

私は自分のプログラムをいくらか保守しやすくしようとしてきました。私は宣言する配列を持っています:

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

次に、この@Pizza配列を次のように別の配列に配置します。

my @food = (\@pizza);

@foodプロパティを介して$p1または$p2にアクセスしようとすると、メモリ参照のように見える「Array{0x8001}」のような値が返されます。私が試したのはこれでした:

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

これにアクセスするための正しい方法は何ですか?プログラムの可読性を高めるために、インデックスを使用しないようにしています。皆さんは私を正しい方向に向けてもらえますか?

よろしく、


これが私がやろうとしていることです:

私はいくつかのデータベースを持っています(話のためにこれは例です)

データベース1
テーブル1(D1T1)| 1列目| 2列目| 3列目| 列4
表2(D1T2)| 1列目| 2列目| 3列目

データベース2
表1(D2T1)| 1列目| 2列目| 列3
表2(D2T2)| 1列目| 2列目| 列3
表3(D2T2)| 1列目| 2列目| 3列目

これらの2つのデータベースの間には、両方のデータベース全体の特定のレコードに関連する情報があります。私がやろうとしているのは、配列を作成し(各配列はデータベースを表します)、変数を挿入します(各変数はデータソース内のtable.fieldを表します)これを実行したら、すべての配列を保持する配列を作成します(dbを表すもの)この配列は、2つのデータベースにまたがる単一のエントリを表し、それを操作できます。例:

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

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

データベース2->表2->列4で何が保持されているかを知りたい場合、ステートメントは何になりますか?代わりにハッシュを使用する必要がありますか?この2次元配列/ハッシュの要件はあります。

どんな助けでも大歓迎です。

MC

4

2 に答える 2

10

何を達成しようとしているのか、どのデータをモデル化しているのかわからない場合、私がお手伝いできるのは構文の混乱だけです。ここにはいくつかの点で混乱があります。

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

それはあなたが意味することをしません。配列を作成しますが、 beおよびto be("Pizza One", "Pizza Two")にも設定します。キーに割り当てようとしていると思います。ハッシュ/関連配列を使用したいと思います:$p1Pizza One$p2Pizza TwoPizza Onep1

# 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]参照しています。@pizzaPerl の参照はスカラーであり、構文が異なります。

# 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};

Foo.Bar.Baz$valuesのすべての値の配列参照、または 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 に答える