Schrift
[thread]9233[/thread]

Kleine Frage



<< >> 10 Einträge, 1 Seite
pl
 2007-07-27 01:24
#78945 #78945
User since
2007-06-05
26 Artikel
BenutzerIn
[default_avatar]
Hallo, ich wollte ein kleines Programm schreiben, welches wenn man es mit "-s" aufruft und wenn man es mit "-l" aufruft etwas bestimmtes ausführt.

Also zum Beispiel,
Code: (dl )
$perl /home/user/foo -s

, sollte eine bestimmte Datei verschieben und
Code: (dl )
$perl /home/user/foo -l

, sollte eine bestimmte Datei löschen.

Nun ist mein Problem, das ich nicht weiß wie ich so was mache, meine erste Überlegung war:
Code: (dl )
1
2
3
4
my $aufruf = pop(@ARGV);
if ( $aufruf =~ /-s/i ) {
....
....


Das klappte aber nicht wirklich (Use of uninitialized value in pattern match (m//) at ./foo line 7.)\n\n

<!--EDIT|pl|1185485244-->
jubei
 2007-07-27 02:09
#78946 #78946
User since
2007-07-19
22 Artikel
BenutzerIn
[default_avatar]
nicht initialisiert sollte $aufruf nur dann sein, wenn du kein argument uebergibst. sonst sollte es eigentlich so klappen, wobei du dann lieber auf ^-s$ testen solltest oder den eq operator benutzt.

grundsaetzlich gibts aber auch die Getopt module fuers parsen der kommandozeile.
Gast Gast
 2007-07-27 07:34
#78947 #78947
So könnte es klappen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl -w
use strict;

my $file = 'test.txt';
my $arg = pop(@ARGV);

if ($arg eq '-s') {
print "Verschiebe Datei\n";
#...
} elsif ($arg eq '-l') {
print "Lösche Datei\n";
#...
} else {
print "Unbekanntes Argument\n";
}


MfG
bieber
 2007-07-27 09:36
#78948 #78948
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
perlre

wenn du dort mal liest, siehst du dass es um pattern geht, nicht um strings, bei deiner Version kann perl mit dem /-s/ nichts anfangen
müsstest du als String kennzeichnen also z.B.

Code: (dl )
$arg=~ qw/-s/
alternativ kannste auch das "-" escapen
Code: (dl )
$arg=~ /\-s/
aber die Version vom Vorposter macht hier sowieso mehr sinn
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
renee
 2007-07-27 09:50
#78949 #78949
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Für so etwas sollte man ein Modul wie CPAN:Getopt::Long verwenden:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;

GetOptions( '-s' => \my $delete );

if( $delete ){
    print "lösche Datei\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2007-07-27 11:44
#78950 #78950
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=bieber,27.07.2007, 07:36]wenn du dort mal liest, siehst du dass es um pattern geht, nicht um strings, bei deiner Version kann perl mit dem /-s/ nichts anfangen
müsstest du als String kennzeichnen also z.B.[/quote]
häh?
Code: (dl )
1
2
3
4
$ perl -wle'
my $x = "-s";
print "ok" if $x =~ /-s/'
ok

bitte vorher selbst ausprobieren und dann erst posten.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2007-07-27 11:49
#78951 #78951
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=pl,26.07.2007, 23:24]Nun ist mein Problem, das ich nicht weiß wie ich so was mache, meine erste Überlegung war:
Code: (dl )
1
2
3
4
my $aufruf = pop(@ARGV);
if ( $aufruf =~ /-s/i ) {
....
....
[/quote]
also es ist erstens ziemlich ungewöhnlich, dass du pop() statt shift()
verwendest. sobald ein argument hintendran gehängt wird, bekommst
du nämlich dieses.
zweitens möchtest du ja wohl, dass der if-block nur ausgeführt wird,
wenn das argument '-s' ist, oder?
=~ ist pattern-matching. wenn du strings vergleichen willst, solltest
du 'eq' benutzen, sonst wird der block auch ausgeführt, wenn jemand
foo-bar-something als argument übergibt.

steht aber auch in perlintro, was man
zum string-vergleich benutzt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
docsnyder
 2007-07-27 13:20
#78952 #78952
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@renee

Getopt::Long ist schon in Ordnung, aber für "einfache" Optionen tut's auch folgendes:

Quote
map { $opts{$_} = 1 if ( $_ =~ m(^-) ) } @ARGV;

if ( defined($opts{-s}) ) {
doSomething();
}

Ist bei vielen Optionen sogar weniger Code ;)

Gruß, Doc\n\n

<!--EDIT|docsnyder|1185529169-->
bieber
 2007-07-27 13:30
#78953 #78953
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
damn, sorry
dabei hab ich es sogar getestet... naja zeugt mal wieder von meiner Unfähigkeit

ich sollte mal wieder zu dem Grundsatz zurückkehren
"wenn man keine Ahnung hat...einfach mal fresse halten"
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
renee
 2007-07-27 21:57
#78954 #78954
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=docsnyder,27.07.2007, 11:20]@renee

Getopt::Long ist schon in Ordnung, aber für "einfache" Optionen tut's auch folgendes:

Quote
map { $opts{$_} = 1 if ( $_ =~ m(^-) ) } @ARGV;

if ( defined($opts{-s}) ) {
doSomething();
}

Ist bei vielen Optionen sogar weniger Code ;)

Gruß, Doc[/quote]
pfui map im void-Kontext ;)

Dein Code ist aber nur wirklich hilfreich wenn es einfache Flags sind. Sobald die Parameter auch Strings oder so als Wert haben können, klappt es nicht mehr so gut... Bei CPAN:Getopt::Long muss man aber nur ein "=s" oder "=n" ... an den Parameternamen hängen (in der GetOptions-Methode).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 10 Einträge, 1 Seite



View all threads created 2007-07-27 01:24.