Schrift
[thread]5739[/thread]

Mathematik: perl und mathematik



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
Gast Gast
 2003-09-19 18:24
#54088 #54088
Hallo,
ich will ein Programm schreiben, das Mathematische Funktionen hat.
Mein Problem ist nun aber, wenn ich sowas zum Beispiel mache:

print (2+3)*(1+2);

dann gibt er mir diese Fehlermeldung aus:
print (...) interpreted as function at ./naehrungsweise_bestimmung_von_pi2 line 7.
Useless use of concatenation in void context at ./naehrungsweise_bestimmung_von_pi2 line 7.

kann es sein das Perl keine Klammer fuer Mathe kennt?
oder gibt es dafuer ein Modul??

Ich danke euch fuer die Hilfe!
pq
 2003-09-19 18:31
#54089 #54089
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
print +(2+3)*(1+2);
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
kabel
 2003-09-19 19:39
#54090 #54090
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
bei mir kommt das hier raus:
Quote
kabel@linux:~> perl
print (2+3)*(1+2);
5kabel@linux:~>


warum das so ist? so interpretiert das perl:
Quote
print(5) * 3;


pq's code wird wegoptimiert:
Quote
print 15;


versuch einer erklärung:
bin mir net sicher, ich hoffe, pq, du hast ne quelle ;)

laut perlop haben listenoperatoren die höchste präzedenz. das print bindet also den klammerausdruck (3+2) an sich, der als die argumentliste interpretiert wird. der rückgabewert vom print () (der hier immer true ist) wird dann mit 3 multipliziert. bei pq's code ist kein klammerausdruck am anfang des terms, sodass der ganze term als ein argument an das print gebunden wird - nachdem dieser wegoptimiert worden ist.
-- stefan
Crian
 2003-09-21 22:38
#54091 #54091
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich glaub nicht, denn man sollte ja nur das sehen, was geprinted wird, nicht, was Perl mit dem Printergebnis noch so weiterrechnet.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
steffenw
 2003-09-22 22:26
#54092 #54092
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Man kann die Klammern von print( (2+3)*(1+2) ); weglassen. Aber keiner zwingt einen dazu. In solchen Fällen wie hier, schreibe ich sie mit, sonst nie.
$SIG{USER} = sub {love 'Perl' or die};
[E|B]
 2003-09-22 22:51
#54093 #54093
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wie wärs damit:

Code: (dl )
print sprintf("%.2f", (2+3)*(1+2));
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Crian
 2003-09-22 23:11
#54094 #54094
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=steffenw,22.09.2003, 20:26]Man kann die Klammern von print( (2+3)*(1+2) ); weglassen. Aber keiner zwingt einen dazu. In solchen Fällen wie hier, schreibe ich sie mit, sonst nie.[/quote]
Hier ist es keine Frage von weglassen können, da sich die Bedeutung total verändert:

Aus print (2+3)*(1+2) macht er (print(2+3))*3 und entfernt dann die sinnlose Multiplikation.

Es gab da doch die schöne Regel, wenn etwas wie ein Funktionsaufruf aussieht, verhält es sich auch so.

Code: (dl )
print (2+3)*(1+2);


Ausgabe

Code: (dl )
1
2
3
print (...) interpreted as function at D:\daten\perl\FORUM\print.pl line 1.
Useless use of multiplication (*) in void context at D:\daten\perl\FORUM\print.pl line 1.
5


:-)\n\n

<!--EDIT|Crian|1064258328-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2003-09-22 23:41
#54095 #54095
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
lustig ist auch

Code: (dl )
print print (2+3)*(1+2);

mit dem Ergebnis

Code: (dl )
1
2
print (...) interpreted as function at D:\daten\perl\FORUM\print.pl line 2.
53


:-D

(Edit: denn print (2+3) gibt 5 aus und 1 zurück, print 1*(1+2) gibt dann dahinter die drei aus)\n\n

<!--EDIT|Crian|1064259838-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Dubu
 2003-09-23 01:03
#54096 #54096
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[E|B
,22.09.2003, 20:51]Wie wärs damit:

Code: (dl )
print sprintf("%.2f", (2+3)*(1+2));

Aua!
s/print s//; ;)
Crian
 2003-09-23 05:31
#54097 #54097
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Allerdings. Das liegt bestimmt daran, das perldoc printf so schlecht dokumentiert ist...

E|B's Code kostet eine temporäre Variable (oder noch mehr?), jedenfalls macht er's unnötig kompliziert.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2003-09-19 18:24.