• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]perl - Schleife über "Felder" einer Zeile

utopos

Member
Lassen wir perl die Zeilen einer Textdatei bearbeiten, deren Zeilen irgendwie in "Felder" getrennt sind, z.B. durch Tabulatoren (wird im Folgenden angenommen).

Nun möchte ich eine doppelte Schleife verwenden, die über die *Felder* einer jeden Zeile läuft.
Das ist auch nicht weiter schwer:

Code:
while (<>) {
    chomp;
    while (/^([^\t]*)\t/) {
        # ####### mach was Spannendes mit $1 ########
        $_ = $'
    } # while \t
} # while <>

Nun denke ich, dass dieses Szenario nicht besonders außergewöhnlich ist, dachte ich, dass es vielleicht andere Lösungen, vielleicht sogar einen "Standardweg" gibt.
Kennt Ihr da Alternativen?
 

abgdf

Guru
Hi utopos,

zunächst mal ist das ja das Verhalten bestimmer Einzeiler, siehe "perldoc perlrun" zu
Code:
perl -e ''
perl -ne '' file
perl -pe '' file
perl -pi '' file
Außerdem ist es auch das "Szenario", das awk bereits voraussetzt, siehe das Thema hier, so daß man sowas auch erstaunlich kurz in awk schreiben kann.

In Perl würde ich persönlich mit der Funktion "split()" arbeiten. Dann hat man die einzelnen Felder bequem in einem Array:
Code:
#!/usr/bin/perl

use warnings;
use strict;

my $line = "Dies\tist\tein\tTest.\n";
my $separator = "\t";
chomp($line);

my @a = split($separator, $line);
my $i;
foreach $i (@a) {
    print "$i\n";
}
Das ist dann auch nicht so kryptisch wie Dein Beispiel. Klar, manche mögen das, sieht nach Profi aus, weil's sonst kein Mensch versteht, aber ich persönlich halte es da eher mit der Maxime aus Python:
Zen of Python schrieb:
Explicit is better than implicit.
Readability counts.
------------
Übrigens kann man auch mit Perl (genauso gut und einfach wie mit Python) auf MySQL-Datenbanken zugreifen:

http://perl.about.com/od/perltutorials/a/perlmysql.htm

Wenn Du also schon Perl kennst (wie Dein Beispiel zeigt), wäre das vielleicht auch eine Möglichkeit. Auch dort wärst Du sicher überrascht, wie schnell und einfach das (im Verhältnis zu C++) geht.
 
OP
U

utopos

Member
Vielen Dank Euch zweien für den Hinweis auf split!
Das ist tatsächlich ziemlich genau das, was ich gesucht habe.
Die kurze Formulierung von spoensche gefällt mir besonders gut, sie kommt ja einer "automatischen" Schleife am nächsten (perl -pqe!?).
abgdf, Du hast recht, die Doppelschleife ist eigentlich genau das awk-Szenario.

@spoensche: Nur fürs Protokoll und die Nachwelt: In Deinem Beispiel ist das Semikolon das Trennzeichen.

@abgdf: Du bist ja richtig awk-begeistert geworden! Deine Kurzeinführung in awk fand ich übrigens sehr überzeugend, ich verstehe, was Dir daran gefällt.
Deine Vorliebe fürs Explizite teile ich dahingehend nicht, als es auch den Blick auf das Eigentliche verstellen kann, wenn man alle Details ausschreibt/ausschreiben muss und den wirklichen Kern des Algorithmus' lesend nicht mehr so leicht findet. Aber das ist natürlich alles eine Geschmacks- bzw. Stilfrage!
 

abgdf

Guru
utopos schrieb:
@abgdf: Du bist ja richtig awk-begeistert geworden! Deine Kurzeinführung in awk fand ich übrigens sehr überzeugend, ich verstehe, was Dir daran gefällt.
Nee, das ist eher robi. Von dem ist auch die Einführung.
Ich hab' mir awk mal angesehen, ziehe aber immer noch Python und Perl vor.
Allerdings ist es schon etwas blöd, wenn im Forum Anfragen zur Änderung von csv-Dateien kommen und dann Lösungen in mindestens drei Sprachen angeboten werden. Insofern werde ich in Zukunft diese Anfragen wohl auch in awk beantworten. Aber das ist dann eher ein Zugeständnis an die werten Forenmoderatoren.
 
OP
U

utopos

Member
abgdf schrieb:
Nee, das ist eher robi. Von dem ist auch die Einführung.

Ähem, ich bin untröstlich ob der Verwechslung. :blush:


Ich habe inzwischen auch einen ziemlich guten Eindruck von awk, denke aber, dass es nicht unbedingt nötig ist, da man in perl die gleichen Aufgaben ählich effizient (das ist der wichtige Punkt) lösen kann - Effizienz hier natürlich beim Progammieren meine.

Ich sperre mich eher dagegen, einfach weil ich die Babylonische Sprachverwirrung auf meinem Rechner bzw. in meinem Kopfe vermeiden möchte.

In diesem Sinne, Спокойной ночи.
 
Oben