Thread unverständnis zu sprintf (22 answers)
Opened by also at 2010-08-13 21:19

Linuxer
 2010-08-13 23:07
#140665 #140665
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Perl unterscheidet nicht nach Datentypen (numerisch/String) wie andere Sprachen.
Entscheidend ist der Kontext in dem die Variable steht, dementsprechend wird die Variable ausgewertet.
Steht sie im numerischen Kontext ( wie beim == Operator) wird der Inhalt numerisch ausgewertet; enthaelt die Variable keinen numerischen Wert, wird versucht, diesen numerisch zu interpretieren; im Zweifelsfall wird 0 verwendet.
Steht zu Begin des Strings eine Zahl, wird diese im numerischen Kontext ausgewertet; ansonsten 0.

Code: (dl )
1
2
3
4
5
for my $str ( "str", "4str", "1.5str" ) {
print "yes, 4 == $str \n" if 4 == $str;
print "yes, 0 == $str \n" if 0 == $str;
print "yes, 1.5 == $str \n" if 1.5 == $str;
}


Wenn Warnungen eingeschaltet sind, dann warnt der Interpreter davor, dass ein
nicht-numerischer Wert in einem numerischen Kontext verwendet wird:

Code: (dl )
Argument "str" isn't numeric in numeric eq (==) at -e line 1.


Diese "Eigenartigkeit" kannst Du ändern, indem Du vor dem numerischen Kontext überprüfst, ob Deine Variable wirklich einen numerischen Wert enthält.

Eine Variante wäre sowas (Test auf integer):
Code: (dl )
1
2
3
4
5
6
if ( $var =~ m/\A[+-]?\d+\z/ ) {    # $var is integer
printf "%d\n", $var;
}
else {
print "%s\n", $var;
}

meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread unverständnis zu sprintf