1
2
3
4
C:\Scripts\Aktuell>Schalter.pl -v
Option verify requires an argument
Falsche Verwendung !
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
use Getopt::Long qw( GetOptions );
Getopt::Long::Configure( );
my $Debug = 'Bob';
my $Module = 26;
my $Verify = 0;
my $Help = 0;
GetOptions('Debug=s' => \$Debug ,
'Module=s' => \$Module ,
'Verify=s' => \$Verify ,
'Help' => \$Help ,
) or die "Falsche Verwendung !" , "\n";
if( $Help )
{
Verwendung( );
} else {
print "Debug : $Debug" , "\n";
print "Module : $Module" , "\n";
print "Verfiy : $Verify" , "\n";
}
sub Verwendung {
print "Common on, it's really not that hard.\n";
}
Quote2. Der Schalter -Module ist unbedingt notwendig für die Verwendung des Schalters -Verify
( Verifizierung des Moduls )
Quote5. Außerdem erkennt er, wenn man den Parameter -v eingibt, die Eingabe als -Verify und meldet :
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use Getopt::Long qw( GetOptions );
Getopt::Long::Configure( );
my $Identifier_Options_Hilfe;
my $Identifier_Options_NoSSL;
my $Identifier_Options_SQL;
my $Identifier_Options_Verify;
my $Identifier_Options_Module;
# ----------------------------------------------------------------------------------------------------------------------------
use Getopt::Long qw(GetOptions);
Getopt::Long::Configure( qw( posix_default no_ignore_case ) );
GetOptions( 'Help' => \$Identifier_Options_Hilfe ,
'Module:s' => \$Identifier_Options_Module ,
'NoSSL:s' => \$Identifier_Options_NoSSL ,
'SQL:s' => \$Identifier_Options_SQL ,
'Verify:s' => \$Identifier_Options_Verify ,
) or print "Falscher Parameter";
if ( defined $Identifier_Options_Hilfe )
{
print "\n";
print "Parameter fuer die Ausfuehrung des Servers in der Konsole :" , "\n";
print "\n";
print "-Help Einblendung dieses Hilfe - Oberflaeche" , "\n";
print "-NoSSL Aktivierung der SSL - Verschluesselung fuer die Verbindung" , "\n";
print " Moegliche Schalter : 0 ( AUS ) oder 1 ( EIN )" , "\n";
print "\n";
print " WARNUNG : Keine Empfehlung fuer unsichere Verbindung" , "\n";
print "\n";
print "-SQL Re - Initialisierung der SQL - DB" , "\n";
print "-Verify Uebepruefung aller notw. Module ( ohne Ausfuehrung )" , "\n";
print "\n";
print " Moegliche Schalter : o Interfaces" , "\n";
print " o Paths" , "\n";
print " o SQL" , "\n";
print " o SSL" , "\n";
} elsif ( defined $Identifier_Options_Hilfe )
{
print "Fehler bei der Erkennung der Parameter : Fehler - Code 1002" , "\n";
}
# ----------------------------------------------------------------------------------------------------------------------------
if ( defined( $Identifier_Options_NoSSL ) )
{
if( $Identifier_Options_NoSSL eq "Yes" ) { print "Aktivierung der SSL - Verschluesselung !" , "\n"; }
if( $Identifier_Options_NoSSL eq "No" ) { print "Deaktivierung der SSL - Verschluesselung !" , "\n"; }
if( $Identifier_Options_NoSSL ne "Yes" && $Identifier_Options_NoSSL ne "No" ) { print "Falscher Parameter !" , "\n"; }
} elsif ( defined $Identifier_Options_NoSSL )
{
print "\n";
print "Fehler bei der Erkennung der Parameter : Fehler - Code 1003" , "\n";
}
# ----------------------------------------------------------------------------------------------------------------------------
if ( defined( $Identifier_Options_Verify ) )
{
if( $Identifier_Options_Verify eq "Paths" ) { my $Pruefung_Module_Paths = "Paths"; &Verify_Modules( $Pruefung_Module_Paths ); }
if( $Identifier_Options_Verify eq "SQL" ) { my $Pruefung_Module_SQL = "SQL"; &Verify_Modules( $Pruefung_Module_SQL ); }
if( $Identifier_Options_Verify eq "SSL" ) { my $Pruefung_Module_SSH = "SSH"; &Verify_Modules( $Pruefung_Module_SSH ); }
if( $Identifier_Options_Verify ne "Paths" && $Identifier_Options_Verify ne "SQL" && $Identifier_Options_Verify ne "SSL" ) { print "Falscher Parameter !" , "\n"; }
} elsif ( defined $Identifier_Options_Verify )
{
print "\n";
print "Fehler bei der Erkennung der Parameter : Fehler - Code 1004" , "\n";
}
# ----------------------------------------------------------------------------------------------------------------------------
sub Verify_Modules {
my $Identifizierung_Module_Pruefung = $_[ 0 ];
if( $Identifizierung_Module_Pruefung eq "Paths" )
{
print "Prueefung der Verzeichnisse des Servers !" , "\n";
}
if( $Identifizierung_Module_Pruefung eq "SQL" )
{
print "Prueefung der SQL - Verbindung & der DB !" , "\n";
}
if( $Identifizierung_Module_Pruefung eq "SSH" )
{
print "Prueefung der SSH - Verbindung !" , "\n";
}
}
# ----------------------------------------------------------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
if ( defined $Identifier_Options_Hilfe ) { print <<EOD_HELP Parameter fuer die Ausfuehrung des Servers in der Konsole : -Help Einblendung dieses Hilfe - Oberflaeche -NoSSL Aktivierung der SSL - Verschluesselung fuer die Verbindung Moegliche Schalter : 0 ( AUS ) oder 1 ( EIN ) WARNUNG : Keine Empfehlung fuer unsichere Verbindung -SQL Re - Initialisierung der SQL - DB -Verify Uebepruefung aller notw. Module ( ohne Ausfuehrung ) Moegliche Schalter : o Interfaces o Paths o SQL o SSL EOD_HELP ; }
1 2 3 4 5 6 7
if ( defined $Identifier_Options_Hilfe ) { (...) } elsif ( defined $Identifier_Options_Hilfe ) { print "Fehler bei der Erkennung der Parameter : Fehler - Code 1002" , "\n"; }
1
2
3
4
5
6
7
eval { local $SIG{__WARN__} = sub { $_[ 0 ] };
GetOptions( 'Help' => \$Identifier_Options_Hilfe ,
'Module:s' => \$Identifier_Options_Module ,
'NoSSL:s' => \$Identifier_Options_NoSSL ,
'SQL:s' => \$Identifier_Options_SQL ,
'Verify:s' => \$Identifier_Options_Verify ) or print "Falscher Parameter"; };
1
2
3
Schalter.pl - => Ausgabe : Kein Ergebnis , also ""
Schalter.pl -- => Ausgabe : Kein Ergebnis , also ""
Schalter.pl --- => Ausgabe : Falscher Parameter
1
2
3
4
5
6
7
8
:!perl getopt_long2.pl --foo=foo - -- ---
-
---
## oder
:!perl getopt_long2.pl - -- ---
-
---
1 2 3 4 5 6 7 8 9 10 11
eval { (GetOptions( 'Help' => \$Identifier_Options_Hilfe , 'Module:s' => \$Identifier_Options_Module , 'NoSSL:s' => \$Identifier_Options_NoSSL , 'SQL:s' => \$Identifier_Options_SQL , 'Verify:s' => \$Identifier_Options_Verify , ) ) }; if ($@) { die "FEHLER: $@\n"; }
Quoteentschuldige, aber wie meinst du das ?
"Folgendes ist vermutlich nicht das, was Du erwartest:"
hilft mir leider nicht bei der Fehlersuche. Im Grunde
geht es ja nur darum die Meldung "Unknown option: x"
abzuschalten.
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
#! /usr/bin/perl use strict; use warnings; use 5.020; use Getopt::Long; #> sub routines #> -------------------------------------------------------------------- sub modified_warnings { my ( $message ) = @_; # Ersetze hier die generische Meldungen jeweils durch eine eigene $message =~ s/Unknown option: .+/Parameter - Fehler/; $message =~ s/Option (.+) requires an argument$/Parameter $1 benoetigt ein Argument./; print STDERR $message; } #> main programm #> -------------------------------------------------------------------- my $foo = "default"; my $bar = "default"; { local $SIG{__WARN__} = \&modified_warnings; GetOptions( 'foo:s' => \$foo, 'bar=i' => \$bar, ) or die "Falsche Verwendung!\n"; }; say "Foo: $foo"; say "Bar: $bar";
1
2
3
4
5
6
7
8
9
10
11
$ perl getopt_long.pl
$ perl getopt_long.pl -v
Parameter - Fehler
Falsche Verwendung!
$ perl getopt_long.pl --Verify=foo
-Verify erfordert die gleichzeitige Angabe von -Module
$ perl getopt_long.pl --Verify=foo --Module
Parameter Module benoetigt ein Argument.
Falsche Verwendung!
$ perl getopt_long.pl --Verify=foo --Module=42
$
1
2
3
4
5
6
7
8
9
10
11
$ perl getopt_long.pl
$ perl getopt_long.pl -v
Parameter - Fehler
Falsche Verwendung!
$ perl getopt_long.pl --Verify=foo
-Verify erfordert die gleichzeitige Angabe von -Module
$ perl getopt_long.pl --Verify=foo --Module
Parameter Module benoetigt ein Argument.
Falsche Verwendung!
$ perl getopt_long.pl --Verify=foo --Module=42
$
1
2
$ perl getopt_long.pl -Verify -Module
--Verify erfordert die gleichzeitige Angabe von --Module
1
2
$ perl getopt_long.pl -Verify -Module=Test
--Verify erfordert die gleichzeitige Angabe von --Module
perldoc Getopt::LongIf the option value is required, Getopt::Long will take the command line argument that follows the option and assign this to the option variable. If, however, the option value is specified as optional, this will only be done if that value does not look like a valid command line option itself.
1 2 3
GetOptions( "Verify=s" => sub { die "ungültiges Argument für Option $_[0]\n" if $_[1] =~ m/^-/; $Verify = $_[1]; }, ) or exit 255;
1 2 3 4 5 6 7 8 9 10 11 12 13 14
sub Check_Single_Option { ( $opt_name, $opt_value, $regex ) = @_; if ( $opt_value !~ $regex ) { die "Ungueltiges Argument fuer $opt_name\n"; } else { return $opt_value; } } GetOptions( "Verify=s" => sub { Check_Single_Option( @_, qr/^[^-/ ) }, ) or exit 255;
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
D:\>c.pl
Kommandozeilen-Framework
=========================
Der Name der Klasse wird als erstes Argument übergben,
weitere Optionen stellt die Klasse bereit.
Klassenübersicht:
=========================
RPC: Remote Procedure Call
Date: Klasse zum Testen einer Datumeingabe
RDBM: Remote Datenbank Manager
BOT: Teste rolfrost.de
RDBF: DBF rolfrost.de erstellen
PROXY: ProxyServer von us-proxy.org abrufen
D:\>c.pl RPC
Remote CMD auf dem Host
--attribute, -a: Zeigt Attribut+Value einer Entity in Konfiguration
--base, -ba: Name der Datenbank für Option --sql
--binary, -bi: Erzeuge die Konfiguration als Binary
--cmd, -c: Freies Kommando im aktuellen Verzeichnis
--dump, -d: Dump Response Object
--entity, -e: Zeigt Attribute einer Entity in Konfiguration
--files, -f: Lokale Dateien für Upload
--head, -he: HEAD Request auf URL
--host, -ho: rolfrost.de oder rolfrost
--irc, -i: Chatserver starten
--request, -r: HTTP Request auf den angegebenen URL oder auf alle URLs
--sql, -s: SQL Anweisung, erfordert --base
--urls, -u: Listet URLs in Konfiguration
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
D:\>c.pl RPC
Remote CMD auf dem Host
--attribute, -a: Zeigt Attribut+Value einer Entity in Konfiguration
--base, -ba: Name der Datenbank für Option --sql
--binary, -bi: Erzeuge die Konfiguration als Binary
--cmd, -c: Freies Kommando im aktuellen Verzeichnis
--dump, -d: Dump Response Object
--entity, -e: Zeigt Attribute einer Entity in Konfiguration
--files, -f: Lokale Dateien für Upload
--head, -he: HEAD Request auf URL
--host, -ho: rolfrost.de oder rolfrost
--irc, -i: Chatserver starten
--request, -r: HTTP Request auf den angegebenen URL oder auf alle URLs
--sql, -s: SQL Anweisung, erfordert --base
--urls, -u: Listet URLs in Konfiguration
D:\>c.pl RPC -host rolfrost.de -ent /
class
descr
file
interface
short
title
D:\>c.pl RPC -host rolfrost.de -ent / -att class
HTMLfile
D:\>
D:\>c.pl RPC -host rolfrost.de -ent / -att title
FWNG, modern MVC Web Application Framework in Perl und in C
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
67
68
69
70
71
72
73
74
75
76
77
78
79
use strict;
use warnings;
use 5.020;
# --------------------------------------------------------------------------------------------------------------------------------
my $Zaehler_Values = @ARGV;
print "Values : $Zaehler_Values" , "\n";
my $Schalter = $ARGV[ 0 ];
# print "Schalter : $Schalter" , "\n";
my $Aufruf_Schalter;
my @Aufruf_Parameter;
my %Aufruf_Testumgebung = ( );
for( my $i = 0; $i < $Zaehler_Values; $i++ )
{
if ( $ARGV[ $i ] =~ m/-/)
{
print "Schalter : $ARGV[ $i ]" , "\n";
$Aufruf_Schalter = $ARGV[ $i ];
}
if ( $ARGV[ $i ] !~ m/-/)
{
print "Parameter : $ARGV[ $i ]" , "\n";
push( @Aufruf_Parameter , $ARGV[ $i ] );
}
$Aufruf_Testumgebung{ $Aufruf_Schalter } = \@Aufruf_Parameter;
}
&Verify_Verarbeitung( \%Aufruf_Testumgebung );
# --------------------------------------------------------------------------------------------------------------------------------
sub Verify_Verarbeitung {
my( %Parameter ) = %{ $_[ 0 ] };
my @Test;
my @Neu;
if( exists $Parameter{ '-Modify' } )
{
print "Gefunden";
@Test = @{ $Parameter{ '-Modify' } };
print $Test[ 0 ];
print $Test[ 1 ];
}
if( exists $Parameter{ '-Neu' } )
{
print "Gefunden";
@Neu = @{ $Parameter{ '-Neu' } };
print $Neu[ 0 ];
print $Neu[ 1 ];
}
}
# --------------------------------------------------------------------------------------------------------------------------------
Könnt ihr mir sagen warum ich in der Subroutine folgendes Ergebnis erhalte :
[code]
$ get_ops.pl -Modify test test -Neu voll cool
Values : 6
Schalter : -Modify
Parameter : test
Parameter : test
Schalter : -Neu
Parameter : voll
Parameter : cool
Gefundentesttest
Gefundentesttest
my %Aufruf_Testumgebung = ( -Modify => @Modify_Werte );
1 2 3 4 5 6 7 8 9 10 11
use Getopt::Long; my @foo; GetOptions( 'foo=s@' => \@foo, ) or exit 255; # ./script --foo alpha --foo beta say $_ for @foo;
1 2 3 4 5 6 7 8 9 10 11 12 13
use Getopt::Long; my @foo; GetOptions( 'foo=s@' => \@foo, ) or exit 255; @foo = split m/,/, join ',', @foo; say $_ for @foo; # ./script --foo alpha,beta --foo gamma
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use strict;
use warnings;
use 5.020;
# --------------------------------------------------------------------------------------------------------------------------------
my $Zaehler_Values = @ARGV;
print "Values : $Zaehler_Values" , "\n";
my $Schalter = $ARGV[ 0 ];
# print "Schalter : $Schalter" , "\n";
my $Aufruf_Schalter;
my @Aufruf_Parameter;
my %Aufruf_Testumgebung = ( );
my $Aufruf_Schalter_Verarbeitung;
for( my $i = 0; $i < $Zaehler_Values; $i++ )
{
if ( $ARGV[ $i ] =~ m/-/)
{
print "Schalter : $ARGV[ $i ]" , "\n";
$Aufruf_Schalter = $ARGV[ $i ];
}
if ( $ARGV[ $i ] !~ m/-/)
{
print "Parameter : $ARGV[ $i ]" , "\n";
push( @Aufruf_Parameter , $ARGV[ $i ] );
}
my $Aufruf_Parameter_Verarbeitung = 'Aufruf_Parameter' . "_" . $Aufruf_Schalter;
$Aufruf_Parameter_Verarbeitung =~ tr/-//d;
print "Verarbeitung : $Aufruf_Parameter_Verarbeitung" , "\n";
$Aufruf_Testumgebung{ $Aufruf_Schalter } = @Aufruf_Parameter;
}
&Verfiy_Verarbeitung( \%Aufruf_Testumgebung );
# --------------------------------------------------------------------------------------------------------------------------------
sub Verfiy_Verarbeitung {
print "Verify" , "\n";
my( %Parameter ) = %{ $_[ 0 ] };
# my @TestArray1 = ( 'eins' , 'zwei' , 'drei' );
# my @TestArray2 = ( 'acht' , 'neun' , 'zehn' );
#
# my %Parameter = ( '-Modify' => \@TestArray1 ,
# '-Neu' => \@TestArray2 );
my @Test;
my @Neu;
print "-Modify => " . $Parameter{ '-Modify' } , "\n";
print "-Neu => " . $Parameter{ '-Neu' } , "\n";
if( exists $Parameter{ '-Modify' } )
{
print "Gefunden";
@Test = @{ $Parameter{ '-Modify' } };
print $Test[ 0 ];
print $Test[ 1 ];
}
if( exists $Parameter{ '-Neu' } )
{
print "Gefunden";
@Neu = @{ $Parameter{ '-Neu' } };
print $Neu[ 0 ];
print $Neu[ 1 ];
}
}
# --------------------------------------------------------------------------------------------------------------------------------
1;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ Schalter.pl -Modify test test -Neu voll cool
Values : 6
Schalter : -Modify
Verarbeitung : Aufruf_Parameter_Modify
Parameter : test
Verarbeitung : Aufruf_Parameter_Modify
Parameter : test
Verarbeitung : Aufruf_Parameter_Modify
Schalter : -Neu
Verarbeitung : Aufruf_Parameter_Neu
Parameter : voll
Verarbeitung : Aufruf_Parameter_Neu
Parameter : cool
Verarbeitung : Aufruf_Parameter_Neu
Verify
-Modify => ARRAY(0xf1e378)
-Neu => ARRAY(0xf1e378)
GefundentesttestGefundentesttest
1 2 3 4
my @arr = (1,2,3); # referenz auf array mit den Inhalten von @arr my $ref = [ @arr ];
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
#! /usr/bin/perl use strict; use warnings; use 5.020; #> sub routines #> -------------------------------------------------------------------- # own options parser sub parse_options { my %data; my @args; my $option; for my $arg ( @ARGV ) { # stop parsing options if ( $arg eq "--" ) { last; } # if it starts with '-', it's an option # this means, arguments must not start with '-' elsif ( $arg =~ m/^-/ ) { # save previous option if ( $option ) { $data{$option} = @args ? [ @args ] : 1; } $option = $arg; @args = (); } # must be an argument else { push @args, $arg; } } # save last option if ( $option ) { $data{$option} = @args ? [ @args ] : 1; } return \%data; } #> main programm #> -------------------------------------------------------------------- # parse options and get ref to hash of options my $options_hRef = parse_options(); # control results require Data::Dumper; say Data::Dumper->new( [ $options_hRef ], [ '*options' ], )->Sortkeys(1)->Useqq(1)->Dump; __END__