Parameteruebergabe mit Getopt::Long

12/01/2014 - 13:00 von nospam | Report spam
Hallo perl.misc,

habe folgenden Konstrukt:

sub _func1_() {
bla bla
}

sub _func2_() {
bla bla
}

sub _func3_() {
bla bla
}

sub _func4_($$) {
bla bla
}

my $funk1 = sub { _func1_ ; } ;
my $funk2 = sub { _func2_ ; } ;
my $funk3 = sub { _func3_ ; } ;
my $funk4 = sub { my ( $param, $x, $y ) = @_ ; _func4_( $x,$y ) ; } ;

use Getopt::Long ;

my $result = Getopt::Long(
"help|h" => $func1 ,
"sum|s" => $func2 ,
"mult|m" => $func3 ,
"rechne=i@" => $func4 ,
) ;

Wobei Parameter "--rechne arg1 arg2" zwei Argumente erwartet.
Die anonyme Funktion $funk4 uebernimmt jedoch nur zwei Argumente
und zwar "$param = --rechne" und "$x = Zahl1".
$y bleibt leer und somit nicht initialisiert.

Ersetze ich i@ durch s@ und das Leerzeichen zwischen den Argumenten
z.B durch Doppelpunkt , uebernimmt die Funktion das zweite Argument
als String arg1:arg2 , den man natuerlich weiter bearbeten kann.

Ich versuchte "rechne=i{3} => $func4" ohne Erfolg.
Es bleibt bei zwei Argumenten.

Was tun ?
Danke.
 

Lesen sie die antworten

#1 Peter J. Holzer
12/01/2014 - 15:29 | Warnen spam
On 2014-01-12 12:00, Selena Muchina wrote:

Hallo perl.misc,

habe folgenden Konstrukt:

sub _func1_() {
bla bla
}

sub _func2_() {
bla bla
}

sub _func3_() {
bla bla
}

sub _func4_($$) {
bla bla
}

my $funk1 = sub { _func1_ ; } ;
my $funk2 = sub { _func2_ ; } ;
my $funk3 = sub { _func3_ ; } ;
my $funk4 = sub { my ( $param, $x, $y ) = @_ ; _func4_( $x,$y ) ; } ;

use Getopt::Long ;

my $result = Getopt::Long(
"help|h" => $func1 ,



Warum so kompliziert?
"help|h" => \&_func1_,
hàtte den gleichen Effekt.

"sum|s" => $func2 ,
"mult|m" => $func3 ,
"rechne=i@" => $func4 ,
) ;

Wobei Parameter "--rechne arg1 arg2" zwei Argumente erwartet.



Das steht aber nicht da. "rechne=i@" bedeutet, dass die Option --rechne
mehrmals vorkommen kann, also so:

./prog --rechne 23 --rechne 42

Für zwei Argumente müsstest Du

"rechne=i{2}" => $func4 ,

schreiben.

Die anonyme Funktion $funk4 uebernimmt jedoch nur zwei Argumente
und zwar "$param = --rechne" und "$x = Zahl1".
$y bleibt leer und somit nicht initialisiert.



Ja, so ist das auch dokumentiert:

| When GetOptions() encounters the option, it
| will call the subroutine with two or three arguments. The first
| argument is the name of the option. (Actually, it is an object that
| stringifies to the name of the option.) For a scalar or array
| destination, the second argument is the value to be stored. For a hash
| destination, the second arguments is the key to the hash, and the third
| argument the value to be stored. It is up to the subroutine to store
| the value, or do whatever it thinks is appropriate.

Es wird immer nur ein Wert übergeben, und zwar entweder als zweites
Argument (bei Skalaren und Arrays, also hier) oder als drittes (bei
Hashes).

Wenn eine Option mehrfach vorkommt (oder mittels {n} mehrere Argumente
hat), wird die Funktion mehrfach aufgerufen:


#!/usr/bin/perl
use Getopt::Long;
use v5.10;

sub dump_param {
for (@_) {
say;
}
}

GetOptions(
'ri=i@' => \&dump_param,
'rs=s@' => \&dump_param,
'r2=s{2}' => \&dump_param,
'rv=s{1,}' => \&dump_param,
);
__END__

% ./selena --ri 1 2 3 --ri 4 5 6 -r2 1 2 3 -rv 1 2 3
ri
1
ri
4
r2
1
r2
2
rv
1
rv
2
rv
3


Was tun ?



In der Funktion die Parameter sammeln und spàter gemeinsam auswerten.
Oder "rechne=s{2}" => \@parameter verwenden und spàter den Inhalt von
@parameter auswerten.

hp


_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel

Ähnliche fragen