www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Beispielprogramm

dbfile-lines.pl
#!/usr/local/bin/perl -w
# dbfile-lines.pl -- Zeilenweises Editieren einer Textdatei.

use DB_File;                    # DB_RECNO Binding
use Fcntl;                      # O_*-Konstanten

# @lines soll ein Abbild einer Textdatei sein.
# $L benoetigen wir fuer put()- und del()-Methoden
$L = tie @lines, 'DB_File', (shift || "/tmp/testfile"),
         O_RDWR | O_CREAT, 0666, $DB_RECNO
     or die "can't tie(): $!\n";

while (($cmd,$pos,$newval) = prompt()) {
    if ($cmd eq 'd') {
        # (d)elete: Zeile Nummer $pos loeschen
    $L->del($pos);
    } elsif ($cmd eq 'c') {
        # (c)hange): Zeile Nummer $pos ersetzen
    $lines[$pos] = $newval;
    } elsif ($cmd eq 'i') {
    # (i)nsert before: Zeile vor $pos einfuegen:
        $L->put($pos, $newval, R_IBEFORE);
    } elsif ($cmd eq 'a') {
        # insert (a)fter: Zeile nach $pos einfuegen:
        $L->put($pos, $newval, R_IAFTER);
    } elsif ($cmd eq '.') {
        # Zeige aktuelle (.) Zeile an Position $pos:
        print "$pos: ", $lines[$pos], "\n";
    } elsif ($cmd eq 'p') {
    # (p)rint all: Zeige alle Zeilen an:
        print join("\n", @lines), "\n";
    } elsif ($cmd eq 'n') {
    # print all with (n)umbers: Zeilen mit Nummern anzeigen:
        print join("\n", map { "$_: $lines[$_]" } 0 .. $#lines),
              "\n";
    } elsif ($cmd eq 'x' or $cmd eq 'q') {
    # e(x)it program: Das war's Leute!
        print "Bye!\n";
        last;
    } else {
    # Unerkanntes Kommando
        print "What? [(d)elete, (c)hange, (i)nsert before,\n";
        print "       insert (a)fter, print current (.) line,\n";
        print "       (p)rint all lines, all (n)umbered lines,\n";
        print "       e(x)it or (q)uit]\n";
    }
}

# Wir sind fertig: $L Referenz aufloesen, dann untie()
undef $L; untie @lines;

sub prompt {
    my ($cmd,$pos,$newval);
    print "Cmd? "; chomp($cmd = <STDIN>) or return ();

    if ($cmd =~ /^[acid.]/) {
    print "Pos? "; chomp($pos = <STDIN>) or return ();
    if ($cmd =~ /^[aci]/) {
        print "Val? "; chomp($newval = <STDIN>) or return ();
    }
    }

    return ($cmd, $pos, $newval);
}
   

[Prev] [Up] [Relevant Chapter] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:55:56 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo