Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12025[/thread]

Perl Rechner

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
MauriZze
 2008-06-16 21:07
#111086 #111086
User since
2008-06-16
4 Artikel
BenutzerIn
[default_avatar]
Hi,
habe am 14.06.2008 um 01.35 Uhr mit Perl angefangen, die Bücher werden noch bestellt, aber mit dem Anfänger Tut von noir2345 konnte ich schon ein bisschen anfangen.

Habe noch Probleme damit, seht selbst:

Code (perl): (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
#!/usr/local/bin/perl
#Perl Rechner
#MauriZze
print q {
Willkommen zum Perl Rechner,
er unter stützt Plus, Minus, Multiplizieren und Geteilt.
Zunächst gibst du deine erste Zahl ein,
dann die Funktion:
1 = Plus, 2 = Minus, 3 = Multiplizieren und 4 = Geteilt
};
@function = ("+","-","*","/");
print "\n";
print "Deine erste Zahl bitte!";
print "\n";
chomp($zahl1 = <STDIN>);
print "\n";
print "Die gewünschte Funktion";
print "\n";
chomp($f = <STDIN>);
print "\n";
print "Deine zweite Zahl bitte";
print "\n";
chomp($zahl2 = <STDIN>);
print "\n";
print "Ergebnis\n";
print $zahl1 $function[$f] $zahl2


mit Rechner.pl -w gibt er folgenden Fehler an:

Rechner.pl -w
Scalar found where operator expected at D:\Projekte\Perl\Rechner.pl line 27, near "] $zahl2"
(Missing operator before $zahl2?)
syntax error at D:\Projekte\Perl\Rechner.pl line 27, next char $
Execution of D:\Projekte\Perl\Rechner.pl aborted due to compilation errors.

Also erwartet er einen Operator vor $zahl2, aber durch den chomp in Line 24 müsste dieser String doch einen haben.
Könnt ihr mir helfen?

MfG MauriZze

//Edit
Für alle die es ohne die Zahlen haben möchten.
Link
murphy
 2008-06-16 21:57
#111088 #111088
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
MauriZze+2008-06-16 19:07:35--
Code (perl): (dl )
1
2
3
[...]
print "Ergebnis\n";
print $zahl1 $function[$f] $zahl2

[...]


Es ist zwar einem Menschen klar, was Du hier tun willst, dem Perlinterpreter kann das aber mangels Typ- und Kontextinformationen nicht klar sein.

Für den Perlinterpreter stehen hier einfach drei Skalare Werte hintereinander, ohne irgendeine Angabe, was damit geschehen soll.

Du musst entweder sagen, dass Du dynamisch Code zusammengebaut hast und ihn ausführen willst:
Code (perl): (dl )
print eval("$zahl1 $function[$f] $zahl2;");


Oder Du musst die Operatoren anders speichern:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@function = (
  sub {
    $_[0] + $_[1];
  },
  sub {
    $_[0] - $_[1];
  },
  sub {
    $_[0] * $_[1];
  },
  sub {
    $_[0] / $_[1];
  }
);
[...]
print $function[$f]->($zahl1, $zahl2);


Auch wenn die erste Variante vielleicht einfacher aussieht, so würde ich stark davon abraten, sie zu verwenden, weil die zweite Variante vermutlich schneller und vor allem sehr viel sicherer und weniger fehleranfällig gegen versehentlich falsch zusammengebaute Ausdrücke ist.

Apropos Fehlerresistenz: Du solltest Dir angewöhnen, jedes Skript mit
Code (perl): (dl )
1
2
use strict;
use warnings;

zu versehen, weil Dir das die Fehlersuche entscheidend erleichtert.
When C++ is your hammer, every problem looks like your thumb.
pq
 2008-06-16 21:58
#111089 #111089
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
du kannst nicht einfach strings hintereinanderschreiben und dann erwarten, dass perl das
als code ausführt.
du musst dafür eval benutzen. da du ja nur ausgewählte operatoren zulässt, ist das
kein problem, du musst nur noch prüfen, ob in den zahlen wirklich auch nur zahlen stehen:
Code (perl): (dl )
1
2
3
4
if ($zahl1 =~ tr/0-9//c or $zahl2 =~ tr/0-9//c) {
    die "Ungültige Zahlen"
}
print eval "$zahl1 $function[$f] $zahl2";

wenn du kommazahlen oder negative zahlen zulassen willst, musst du die prüfung noch daraufhin anpassen.
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
Gast Gast
 2008-06-16 22:07
#111093 #111093
Code (perl): (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
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
#!/usr/local/bin/perl
#Perl Rechner
#MauriZze

use strict;
use warnings;

my $zahl1=1;
my $zahl2=1;
my $f=1;
my $ergebnis=0;

print q {
Willkommen zum Perl Rechner,
er unter stützt Plus, Minus, Multiplizieren und Geteilt.
Zunächst gibst du deine erste Zahl ein,
dann die Funktion:
1 = Plus, 2 = Minus, 3 = Multiplizieren und 4 = Geteilt
};
print "\n";
print "Deine erste Zahl bitte!";
print "\n";
chomp($zahl1 = <STDIN>);
print "\n";
print "Die gewünschte Funktion";
print "\n";
chomp($f = <STDIN>);
print "\n";
print "Deine zweite Zahl bitte";
print "\n";
chomp($zahl2 = <STDIN>);
print "\n";


if($f==1)
{
 $erbenis=addiere($zahl1,$zahl2);
}
elsif($f==2)
{
 $erbenis=subtrahiere($zahl1,$zahl2);
}
elsif($f==3)
{
  $erbenis=multipliziere($zahl1,$zahl2);
}
elsif($f==4)
{
  $erbenis=dividiere($zahl1,$zahl2);
}
else
{
 print "Keine erlaubte Aktion!\n";
}
print "Ergebnis: $ergebnis\n";

##############################
##############################

sub addiere
{
 my ($wert1,$wert2)=@_;
 return $wert1 + $wert2;
}

sub subtrahiere
{
 my ($wert1, $wert2)=@_;
 return $wert1 - $wert2;
}

sub multipliziere
{
 my ($wert1, $wert2)=@_;
 return $wert1 * $wert2;
}

sub dividiere
{
 my ($wert1, $wert2)=@_;
 return $wert1 * $wert2;
}
murphy
 2008-06-16 22:14
#111094 #111094
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Mein Vorschlag:
Code (perl): (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
#!/usr/local/bin/perl
use strict;
use warnings;

my %operators = (
  '+' => sub { $_[0] + $_[1] },
  '-' => sub { $_[0] - $_[1] },
  '*' => sub { $_[0] * $_[1] },
  '/' => sub { $_[0] / $_[1] }
);

$|++; # Flush output automatically

print 'First operand:  ';
chomp (my $operand1 = <>);

print 'Operator:       ';
chomp(my $symbol = <>);

print 'Second operand: ';
chomp(my $operand2 = <>);

die "Unknown operator $symbol\n" if (!exists $operators{$symbol});

print "----------------\nResult:         ",
      $operators{$symbol}->($operand1, $operand2),
      "\n";
When C++ is your hammer, every problem looks like your thumb.
MauriZze
 2008-06-16 23:10
#111102 #111102
User since
2008-06-16
4 Artikel
BenutzerIn
[default_avatar]
ok, ich habe jetzt erstmal das mit den subs probiert, da bekomm ich einen haufen fehler wieder.
aber ich verstehe da den vorgang ^^
bei der letzten klappt alles 1a, man kann operatoren sogar schon bei eingeben angeben, sehr nice, ich stze mich aber jetzt nochmal andas sub dingens!

jetzt klappts, hatte die my's nicht reingetan.
betterworld
 2008-06-17 01:19
#111118 #111118
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn es Dein zweiter Tag mit Perl ist, wuerde ich Dir wirklich nicht raten, irgend etwas mit eval "" zu machen. Das sollte man sich auf keinen Fall angewoehnen, weil es allgemein als schlechter Programmierstil anerkannt ist und ausserdem sehr leicht Sicherheitsprobleme bedeuten kann.

Die Loesung letzte Loesung von murphy ist da viel eleganter und zeigt, dass es auch ohne eval geht.
MauriZze
 2008-06-17 19:21
#111156 #111156
User since
2008-06-16
4 Artikel
BenutzerIn
[default_avatar]
das von pq meinte ich auch garnicht, ich meinte das von Gast.

ok, jetzt hab ich auch das von murphy auch (fast) verstanden, sehr cool, danke!!

das ausser bezieht sich auf Line 12.
was bedeutet die?

MfG MauriZze
GwenDragon
 2008-06-17 19:26
#111157 #111157
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
$| ist für das Flushen der Dateipuffer (auch für STDOUT) zuständig.

Quote
HANDLE->autoflush(EXPR)
$OUTPUT_AUTOFLUSH
$|

If set to nonzero, forces a flush right away and after every write or print on the currently selected output channel. ....
Quelle: http://perldoc.perl.org/perlvar.html
Hagen
 2008-06-17 23:27
#111158 #111158
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-06-16 23:19:26--
..., irgend etwas mit eval "" zu machen. Das sollte man sich auf keinen Fall angewoehnen, weil es allgemein als schlechter Programmierstil anerkannt ist und ausserdem sehr leicht Sicherheitsprobleme bedeuten kann.


Kann mir jemand erklären, warum "eval" ein schlechter Programmierstil ist?
Gruß
Hagen
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2008-06-16 21:07.