Thread Programm am ende wiederholen (14 answers)
Opened by SCORRPiO at 2014-02-17 17:01

Linuxer
 2014-02-18 15:47
#173631 #173631
User since
2006-01-27
3872 Artikel
HausmeisterIn

user image
Hier mal ein möglicher Ansatz ohne given/when:

edit: More-Tags; neuen Code hinzugefügt

Alter Ansatz:
more (10.5kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#! /usr/bin/perl
use strict;
use warnings;

use feature qw( say );

# Welche Beschriftung soll welche Aktion auslösen
my %dispatch = (
        'Tabelle anzeigen'      => \&show_table,
        'Daten eintragen'       => \&insert_data,
        'Daten aendern'         => \&change_data,
        'Programm verlassen'    => \&exit_programm,
);

# Reihenfolge der Beschriftungen festlegen
my @order = (
        '',                     # dummy, um index 0 zu belegen
        'Tabelle anzeigen',
        'Daten eintragen',
        'Daten aendern',
        'Programm verlassen',
);

# definieren nun die subroutinen für die Aktionen

sub show_table {
        say "Schau, eine Tabelle.\n";
}

sub insert_data {
        say "Tragen Sie Daten ein.\n";
}

sub change_data {
        say "Machen Sie hier Ihre Daten kaputt.\n";
}

sub exit_programm {
        # Aufräumen; DB schließen, etc.
        say "Programm ist zuende.\n";
        exit 0;
}


# Hauptprogramm

while ( 1 ) {
        say "Datenbank Verwaltung\n";
        say "Was möchten Sie tun?";

        # Menue ausgeben
        printf "%2d) %s\n", $_, $order[$_]      for 1 .. $#order;

        # Eingabe lesen und vom Newline befreien
        chomp( my $input = <STDIN> );

        # nur Integer erlaubt; und nur im Bereich von 1 bis $#order (letzter Index in @order)
        if ( $input !~ m/\A\d+\z/ || $input > $#order || $input < 1 ) {
                warn "Eingabe ungueltig.\n";
                redo;
        }
        else {
                # rufe subroutine
                $dispatch{ $order[$input] }->();
        }
}



Neuer Ansatz mit nur einer Struktur (Array of Hash) für das Menue:

more (2.1kb):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#! /usr/bin/perl
use strict;
use warnings;

use feature qw( say );


my @menu = (
{ label => 'Tabelle anzeigen', action => \&show_table, },
{ label => 'Daten eintragen', action => \&insert_data, },
{ label => 'Daten aendern', action => \&change_data, },
{ label => 'Programm verlassen', action => \&exit_program, },

);


# definieren nun die subroutinen für die Aktionen

sub show_table {
say "Schau, eine Tabelle.\n";
}

sub insert_data {
say "Tragen Sie Daten ein.\n";
}

sub change_data {
say "Machen Sie hier Ihre Daten kaputt.\n";
}

sub exit_program {
# Aufräumen; DB schließen, etc.
say "Programm ist zuende.\n";
exit 0;
}


# Hauptprogramm

while ( 1 ) {
say "Datenbank Verwaltung\n";
say "Was möchten Sie tun?";

# Menue ausgeben
printf "%2d) %s\n", $_, $menu[$_]->{label} for 1 .. $#menu;

# Eingabe lesen und vom Newline befreien
chomp( my $input = <STDIN> );

# nur Integer erlaubt; und nur im Bereich von 1 bis $#menu (letzter Index in @menu)
if ( $input !~ m/\A\d+\z/ || $input > $#menu || $input < 1 ) {
warn "Eingabe ungueltig.\n";
redo;
}
else {
# rufe subroutine
$menu[$input]->{action}->();
}
}

[/mode]

Last edited: 2014-02-18 17:25:21 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Programm am ende wiederholen