Schrift
[thread]6826[/thread]

$ARGV auf Eingabe überprüfen

Leser: 3


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
DrWhiteLetter
 2005-03-30 13:48
#53075 #53075
User since
2005-01-30
26 Artikel
BenutzerIn
[default_avatar]
Morgen,

habe schon wieder eine Anfängerfrage, ich komme einfach nicht weiter, wenn ich $ARGV auf (irgendeine) Eingabe überprüfen will. Das Problem liegt hier dabei, dass entweder Zahlen oder Strings überprüft werden können.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if($#ARGV==0) 
{
print "Bitte Massstab eingeben (Bsp: 1:100): ";
$eingabe=<STDIN>;
@massstab=split(/:/,$eingabe);
$ze=1000/$massstab[1];
print "\n\t$ze = 1\n";
exit(0);
}

else
{
$eingabe=$ARGV[0];
@massstab=split(/:/,$eingabe);
$ze=1000/$massstab[1];
print "\n\t$ze = 1\n";
exit(0);
}

Bringt folgenden Fehler:

Use of uninitialialized value in division (/) at massstab.pl line 25.
Illegal division by zero at massstab.pl line 25

Das wäre folgende Zeile:
Code: (dl )
$ze=1000/$massstab[1];


Mach ich aus der if-Abfrage folgendes:
Code: (dl )
if($ARGV eq '') 

Krieg ich diesen Fehler:
Use of uninitialized value in string eq at massstab.pl line 11.

und dann läuft das Programm aber ohne Probleme.

Bitte gebt mir einen kleinen Gedankenstoß...
Rambo
 2005-03-30 13:56
#53076 #53076
User since
2003-08-14
803 Artikel
BenutzerIn

user image
so vielleicht?

Code: (dl )
1
2
3
use strict;
use warnings;
my $ze="1000/$massstab[1]";
GwenDragon
 2005-03-30 14:27
#53077 #53077
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
So geht schöner ;)
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
#!/usr/local/bin/perl -w

use strict;
use warnings;

my ($eingabe, @massstab, $ze);

if(scalar @ARGV == 0)
{
print "Bitte Massstab eingeben (Bsp: 1:100): ";
$eingabe=<STDIN>;
}
else
{
$eingabe=$ARGV[0];
}

do {
print "*** FEHLER: Bitte nur Zahlen, getrennt mit Doppelpunkt eingeben\n";
exit( -1);
} unless $eingabe =~ /^\d+:\d+$/;

@massstab=split(/:/,$eingabe);
$ze=1000/$massstab[1];
print "\n\t$ze = 1\n";

exit(0);

1;
renee
 2005-03-30 14:37
#53078 #53078
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@GwenDragon: Ich würde das exit(-1); rausnehmen, sonst beendest Du ja das Programm...
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/
GwenDragon
 2005-03-30 15:09
#53079 #53079
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
[quote=renee,30.03.2005, 12:37]@GwenDragon: Ich würde das exit(-1); rausnehmen, sonst beendest Du ja das Programm...[/quote]
Das Programm soll doch bei fehlerhaften Zeahlen abbrechen, das ist eine korrekte Fehlerbehandlung.

Ohne das exit(-1)?: Versuch doch dann mal 1:Assel als Parameter, dann erlebst du bei der Division dein blaues Wunder!
Strat
 2005-03-30 15:43
#53080 #53080
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das problem war, dass $#ARGV den letzten Index des Arrays @ARGV zurueckgibt... wenn da ein Wert drinnen ist, ist der 0... wenn @ARGV leer ist, ist der -1...
also entweder ... $#ARGV == -1 oder, wie GwenDragon vorschlug, scalar(@ARGV) == 0 verwenden:

Das folgende gilt immer (und wenn nicht, erschlage den Programmierer, der den Code geschrieben hat... es waere kein Verlust fuer die Welt...siehe die Variable $[ in perldoc perlvar)
Code: (dl )
$#ARGV + 1 == scalar(@ARGV)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Taulmarill
 2005-03-30 15:43
#53081 #53081
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich glaube renee wollte eher darauf aufmerksam machen, dass man danach seinen falschen wert nicht ohne neustart des programms korrigieren kann.
Code: (dl )
1
2
3
4
while ( $eingabe !~ /^\d+:\d+$/ ) {
print "*** FEHLER: Bitte nur Zahlen, getrennt mit Doppelpunkt eingeben\n";
$eingabe = <STDIN>;
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2005-03-30 15:57
#53082 #53082
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
genau, Taulmarills glaube war richtig! Sonst macht das do{}while absolut keinen Sinn. Natürlich muss man dann, wie Taulmarill es geschrieben hat, einen neuen Wert abfragen!
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/
GwenDragon
 2005-03-30 16:17
#53083 #53083
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
[quote=renee,30.03.2005, 13:57]genau, Taulmarills glaube war richtig! Sonst macht das do{}while absolut keinen Sinn. Natürlich muss man dann, wie Taulmarill es geschrieben hat, einen neuen Wert abfragen![/quote]
Ja, dann gehört der do-Block sowieso woanders hin. Mein Code war nur ein Beispiel, wie es geht.
Wenn das Programm als Batch läuft ist z. B. ein exit(-1) ganz sinnvoll. Anstatt
Code: (dl )
1
2
3
4
do { 
print "*** FEHLER: Bitte nur Zahlen, getrennt mit Doppelpunkt eingeben\n";
exit( -1);
} unless $eingabe =~ /^\d+:\d+$/;
hätte auch ein
Code: (dl )
die "*** FEHLER: Bitte nur Zahlen, getrennt mit Doppelpunkt eingeben\n" if  $eingabe !~ /^\d+:\d+$/;
gereicht.

Sorry. Mein Code war nicht die komplette Lösung ;)\n\n

<!--EDIT|GwenDragon|1112186007-->
pq
 2005-03-30 20:33
#53084 #53084
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,30.03.2005, 13:43]Das folgende gilt immer (und wenn nicht, erschlage den Programmierer, der den Code geschrieben hat... es waere kein Verlust fuer die Welt...siehe die Variable $[ in perldoc perlvar)
Code: (dl )
$#ARGV + 1 == scalar(@ARGV)
[/quote]
folgendes gilt aber wirklich immer:
$#array - $[ + 1 == @array;
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
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-03-30 13:48.