2009-04-25 1 views
1

Heylo wieder,Perl - Zugriff auf und Array-Element, das in einem anderen Array gehalten wird

Ich habe versucht, mein Programm etwas wartungsfreundlicher zu machen. Ich habe ein Array, das ich erklären:

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

ich dann gehen Sie vor und setzen diese @Pizza Array in ein anderes Array, etwa so:

my @food = (\@pizza); 

Wenn ich versuche, p2 für den Zugriff auf entweder $ p1 oder $ Über die @ food -Eigenschaft erhalte ich einen Wert wie "Array {0x8001}", der eine Speicherreferenz zu sein scheint. Was ich versucht war:

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

Was ist der corret Weg, dies zugreifen? Ich suche, Indizes NICHT zu verwenden, um Programmlesbarkeit zu erleichtern. Könnt ihr mir in die richtige Richtung zeigen?

Grüße,


Dies ist, was ich zu tun versucht:

ich mehrere Datenbanken (für Gespräche willen dies ein Beispiel ist)

Datenbank One
Table One (D1T1) | Spalte Eins | Spalte Zwei | Spalte drei | Spalte Vier
Tabelle Zwei (D1T2) | Spalte Eins | Spalte Zwei | Spalte Drei

Datenbank Zwei
Tabelle Eins (D2T1) | Spalte Eins | Spalte Zwei | Spalte Drei
Tabelle Zwei (D2T2) | Spalte Eins | Spalte Zwei | Spalte Drei
Tabelle Drei (D2T2) | Spalte Eins | Spalte Zwei | Spalte 3

Zwischen diesen beiden Datenbanken gibt es Informationen, die sich auf bestimmte Datensätze beziehen, die sich über beide befinden. Was ich versuche, ist ein Array zu erstellen (jedes Array wird eine Datenbank darstellen) und Variablen einfügen (jede Variable wird ein Table.field innerhalb der Datenquelle darstellen) Sobald ich dies getan habe, erstelle ich ein Array für alle Arrays (Die, die die DBs repräsentieren), da dieses Array einen einzigen Eintrag zwischen den beiden Datenbanken darstellt, auf den ich dann reagieren kann. Beispiel:

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

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

Wenn ich wissen möchte, was in Datenbank 2 -> Tabelle 2 -> Spalte 4 gehalten wurde, was wäre die Aussage? Sollte ich stattdessen Hashes verwenden? Ich habe eine Anforderung für dieses zweidimensionale Array/Hash.

Jede Hilfe wird sehr geschätzt.

MC

+1

gibt es keinen Grund, warum Sie ein Array hier anstelle eines Hash verwenden? Was du in der ersten Zeile machst, ist ein Array zu erstellen: @pizza = ("Pizza One", "Pizza Two") und zwei Variablen $ p1 = "Pizza One", $ p2 = "Pizza Two". Das ist mehr oder weniger, wo ich dich verliere. Versuchen Sie den Index von @pizza zu finden, der den Wert $ p1 hat? –

+4

Vielleicht wäre es besser, wenn Sie aufhörten und die Datenstruktur beschrieben, die Sie erstellen möchten und wie Sie darauf zugreifen möchten. Etwas wie: Ich möchte eine Liste von Lebensmitteln nach Kategorien wie Pizza, und ich möchte, dass diese Kategorien einzelne Rezepte über Rezeptnamen (wie "Hawaiian Pizza") zugreifen können. Sobald wir wissen, was Sie mit den Daten machen, können wir Ihnen helfen. –

+0

Auch wenn Sie Ihr Problem nicht von Grund auf erklären und nach Lösungsvorschlägen fragen möchten, erklären Sie zumindest, was Sie mit dem von Ihnen geposteten Code zu tun haben. Mein @pizza = ($ p1 = "Pizza One", $ p2 = "Pizza Two") sieht einfach komisch aus und da es nicht offensichtlich ist, was Sie versuchen, ist es schwer, Sie in die richtige Richtung zu weisen. –

Antwort

10

Nicht zu wissen, was Sie versuchen, zu erreichen, welche Daten Sie modellieren, alles, was ich Ihnen helfen kann, ist die Syntax Verwirrung. Hier gibt es Verwirrung in mehreren Punkten.

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

Das tut nicht was du meinst.Es macht das Array ("Pizza One", "Pizza Two"), aber es setzt auch $p1 zu Pizza One und $p2 zu Pizza Two sein. Ich denke, Sie versuchen, den Schlüssel Pizza One dem Schlüssel p1 zuzuweisen. Ich glaube, Sie wollen einen Hash/verknüpften Array verwenden:

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

Jetzt $pizzas{p1} ist Pizza One. Alternativ können Sie nur eine Liste:

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

Und dann ist $pizzas[0]Pizza One. Bewegen Sie sich auf ...

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

Sie versuchen, eine andere Liste zu machen, um @pizza zu verweisen. Das obige macht $food[0] Bezug auf @pizza was nicht gemeint ist. Referenzen in Perl sind Skalare und haben unterschiedliche Syntax.

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

Jetzt ist $food->[0]Pizza One und $food->[0] ist Pizza Two.

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

Smacks nur Hinzufügen von mehr Klammern, bis Sie ausgegeben haben. Ich würde empfehlen, die Perl Data Structures Cookbook zu lesen. Oh, und schalte Warnungen ein. Schalte sie nicht aus, bis sie alle weg sind und schalte sie nicht aus, weil sie zu viele sind. Ja wirklich. Wirklich wirklich.

aktualisieren

"Ich will wissen, was in der Datenbank 2 gehalten wurde -> Tabelle 2 -> Spalte 4, was die Aussage sein würde"

Verwenden Sie keine Zahlen. Benenne sie, denn ich bin mir sicher, dass sie Namen haben. Also ja, du willst Hashes. Sagen wir Datenbank Foo -> Tabellenleiste -> Spalte Baz. Sie würden den Zugang, die gerne ...

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

oder lange Hand

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

Wo $values ein Array ref aller Werte von Foo.Bar.Baz sein kann, oder eine andere Hash durch die verkeilt Primärschlüssel von Foo.Bar. Was sinnvoller ist, hängt davon ab, was Sie mit den Daten tun.

Ich überlasse es Ihnen, Chaz 'Antwort anzupassen, um Hashes statt Arrays zu generieren.

Natürlich muss ich fragen, warum die beiden Datenbanken in eine große In-Memory-Struktur auslagern und dann daran arbeiten? Wenn Sie Datenbanken haben, fragen Sie sie ab. Es wird schneller und flexibler sein.

Wir sind zurück zu den grundlegendsten Fragen; Was versuchen Sie WIRKLICH?

+0

Ich denke, er meint, dass er nicht viele magische Zahlen durch seinen Code streuen möchte (wie $ object [1]), für die die Lösung entweder ein Hashref anstelle einer Arrayref ist, oder "constant verwenden" oder "enum verwenden" "um Konstanten für Ihre Feldindizes zu deklarieren. – cjm

+0

Das ist genau CJM. Die Schlüssel, auf die ich zugreifen will, müssen die Daten darstellen, die sie enthalten. Ich habe den ursprünglichen Beitrag bearbeitet, um zu verdeutlichen, was ich versuche zu tun. Ich denke, dass Hash-Referenzen der Weg zu gehen sind, google ich zweidimensionale Hashes um zu sehen, ob ich irgendwo hinkomme. Ich schätze deine Hilfe sehr. –

+0

Ahh, ich habe es falsch verstanden als "Ich suche NICHT nach Indexen ..." – Schwern

0

Basierend auf, was Sie ist beschrieben klingt wie Sie so etwas wie dieses benötigen:

#!/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 
Verwandte Themen