Readers: 22
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
use strict; use warnings; use feature qw/:5.10/; #use ...; $| = 1; BEGIN { sub script_path { my $script_path = $0; $script_path =~ s/(.+)\\.+$/$1/; return $script_path; } push @INC, script_path(); binmode(STDOUT, ":encoding(cp850)"); binmode(STDIN, ":encoding(cp850)"); } $SIG{INT} = sub { exit }; # ein paar gängige subs # sub Foo { ... } my $x = 1; my @perl_files = glob script_path.'/*.pl'; for my $perl_file (@perl_files) { printf("%2d %s\n", $x++, $perl_file); } print "\n"; my $choice = <>; chomp($choice); print "\n===========================\n\n"; open (my $fh, '<', $perl_files[$choice-1]) || die "$!"; my $data = join('', <$fh>); eval qq|#line 1 "$perl_files[$choice-1]"\n$data|; die $@ if $@; close $fh;
2014-09-18T07:57:28 MuffiHmm - und was ist jetzt der Unterschied, ob die unzählingen Scripts *.pl oder *.pm heißen?
2014-09-18T08:16:39 rostiWieso suchen? Sinnvolle Perl-Programme/Tools sind unter Windows als Batchdatei vorhanden oder unter Linux als Perl-programm ohne Extension, und alle die sind im Suchpfad.Du musst die ungezählten *.pl nicht suchen, noch reingucken oder einzeln aufrufen um zu sehen, welche Perl-Tools auf einer Kiste bereitgestellt sind.
QuoteWie kannst du denn mit CLI bewerkstelligen, dass deine "Unter-Module" immer alle nötigen Packages mitbringen?
SQL_Remote SQL-Statements auf der Kommandozeile, remote Management MySQL
prompt>cli.pl SQL_Remote --servername example.com --database shop --statement "drop table customer"
QuoteBei Deinem Framework muss ich die Optionen an zwei Stellen pflegen. Zum Einen bei getoptions() und in der Beschreibung...
1 2 3 4 5 6 7
#!/usr/bin/perl use strict; use warnings; use MY::CLI; MY::CLI->run;
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
package MY::CLI::Command::Date; use strict; use warnings; use MY::CLI -command; use Time::Piece; sub abstract { return "Give information about a date"; } sub usage_desc { return "cli.pl Date --date <date>"; } sub opt_spec { return ( [ 'date=s', 'A date you want information about' ], ); } sub validate_args {} sub execute { my ($self, $opt, $args) = @_; if ( !$opt->{date} ) { print $self->usage->text; return; } my $time = Time::Piece->strptime( $opt->{date}, '%Y-%m-%d' ); print sprintf "Datum: %s KW: %s Schaltjahr: %s\n", $time->dmy('.'), $time->week, $time->is_leap_year; } 1;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ perl cli.pl
Available commands:
commands: list the application's commands
help: display a command's help screen
date: Give information about a date
$ perl cli.pl date
cli.pl Date --date <date>
--date A date you want information about
$ perl cli.pl date --date 2012-09-18
Datum: 18.09.2012
KW: 38
Schaltjahr: 1
$ perl cli.pl date --date 2014-09-18
Datum: 18.09.2014
KW: 38
Schaltjahr: 0
2014-09-18T18:01:18 rostiApp::Cmd gibts fast 10 Jahre lang. Du hast deine Idee schon vor 2007 veröffentlicht? ;)PS/Ed: App::Cmd ist relativ neu, ich kannte es noch nicht. Es ist normal, dass Programmierer zeitnah einander ähnliche Ideen haben, die sich aus der Praxis ergeben.
QuoteApp::Cmd gibts fast 10 Jahre lang. Du hast deine Idee schon vor 2007 veröffentlicht? ;)
1 2 3 4 5 6 7 8 9
sub init{ my $self = shift; # declare opts $self->{OPTS} = { date => {type => 's', descr => "Datum, Format T.M.J oder T.M.-J (v. Chr.)"}, version => { descr => "Zeigt die Version dieser Anwendung, wenn als Flag gesetzt"}, verbose => { descr => "Gibt weitere Informationen aus, wenn als Flag gesetzt" }, }; }
1
2
3
4
5
D:\>cli.pl Date
Untersucht ein eingegebenes Datum, Optionen:
--date, -d: Datum, Format T.M.J oder T.M.-J (v. Chr.)
--verbose, -verb: Gibt weitere Informationen aus, wenn als Flag gesetzt
--version, -vers: Zeigt die Version dieser Anwendung, wenn als Flag gesetzt