PERL - macht in $array->[1]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

PERL - macht in $array->[1]

Beitrag von Duff » 08.11.2006 14:12:34

Hallo,

ich habe leider schon wieder eine Frage zu PERL.

Ich habe ein Script mit einer Datenbankabfrage und speichere alles in einer $aref.

Code: Alles auswählen

my $arrayRef = getData($param1);
Das ganze wird dann so ausgegeben:

Code: Alles auswählen

foreach my $array ( @{$arrayRef} )
{
        print $array->[0], "\n", $array->[1], "\n";
}
Das $array->[0] hat den Aufbau von einer Zeile und das $array->[1] besteht aus mehreren Zeilen. Ich möchte nun noch im $array->[1] nicht alle Zeilen ausgeben, sondern nur die Zeilen, die einen bestimmtes pattern beinhalten. Doch ich weiß nicht genau, wie ich den match-Operator auf das $array->[1] anwenden kann/muss.
Oh, yeah!

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 08.11.2006 14:17:12

Hm, ohne zu wissen, wie deine Daten nun genau aussehen, aber schau dir mal die Funktion grep an. Damit koenntest du eventuell die gewuenschten Daten rausholen.
Oder du gibts mal ein Beispiel, wie deine Datenstruktur genau aussieht.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 08.11.2006 15:01:28

Die Datenstruktur sieht so aus, dass im $array->[0] eine Zeile mit einem String vorhanden ist und das im $array->[2] mehrere Zeilen enthalten sind bzw. dort ein komplettes xml-Dokument zurück geliefert wird. Aus diesem xml-Dokument würde ich dann gerne nur bestimmte "Zeilen/tags" raus greppen/nehmen.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 08.11.2006 15:43:10

NACHTRAG.

Wenn ich ein

Code: Alles auswählen

print Dumper ($arrayRef);
einbaue, sieht das Ergebnis so aus:

Code: Alles auswählen

$VAR1 = [
          [
            'langer String',
            '<XMLl -Dokument>
<ein neuer Tag>
<und noch weitere verschiedene Tags im xml-Dokumen>'
          ]
        ];
Oh, yeah!

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 08.11.2006 15:56:52

Hm, eventuel sowas:

Code: Alles auswählen

my @wantedLines = grep(/PATTERN/, @{$array->[2]});
Muesstest du dir halt ein entsprechendes Pattern basteln. Oder musst du mehr mit XML machen? Da wuerde sich dann eventuell auch ein entsprechendes Modul anbieten, mit dem du die passenden Daten aus diesem Feld holen kannst.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 08.11.2006 16:48:50

Danke für die Antwort. Diese Variante werde ich gleich mal ausprobieren.

Habe es jetzt so gelöst bekommen:

Code: Alles auswählen

my $array2;
foreach my $array ( @{$arrayRef} )
{
        #print $array->[0], "\n", $array->[1],"\n";
        while ($array->[1] =~ /(<[^>]*?STRING[^>]*?>)(\d{10,15})<\/[^>]*?STRING[^>]*?>/igm){
                $array2="$2\t --> $1";
        }
        printf "%-90s :  %-s\n", $array->[0], $array2;
}
Wobei ich noch eine Frage hätte. Und zwar: Kann ich die Ausgabe in $array2 auch irgendwie mit printf in formatierter Weise speichern, so dass die Gesamtausgabe "schöner" aussieht?
Oh, yeah!

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 08.11.2006 16:54:53

Mit sprintf formatieren?

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 08.11.2006 17:04:25

Ich meinte eigentlich nur, dass die Gesamtausgabe von

Code: Alles auswählen

printf "%-90s :  %-s\n", $array->[0], $array2; 
dann besser aussieht, da mein $array2 ja einfach nur ein String ist, der NICHT formatiert ist.

Habe aber das Problem, dass in der foreach-Schleife der Ausgabe, genauer noch in der while-Schleife ein Pattern auch öfter als 1 mal aufteten kann. Durch meine Variante wird aber der String ja jedesmal überschrieben, so dass ich im String nur den letzten gefundenen Pattern stehen habe. Wenn ich das ganze mit einem Array mache, wird das Array ohne Ende lang.
Oh, yeah!

Antworten