"2" in Zahl umwandeln?!
am 01.06.2006 18:49:10 von Gerhard Wolf
Hallo,
ich habe folgende Zeilen in meinem perl/Tk script:
$mw->bind("",
sub {
my $w = shift;
my $e = $w->XEvent;
if ($e->K eq "0" || $e->K eq "1" || $e->K eq "2") {
$pausezeit = $e->K;
...
...
sleep($p); # geht nicht weil das gleich sleep("2")
sleep(oct($p)); # geht aber damit kann ich die tasten 8 und 9
nicht verwenden, denn die ergeben logischw. 0
int($p) wandelt einen String nicht in eine zahl um (ok steht auch so in
der Doku)
Aber Welche Funktion nehme ich jetzt?
Re: "2" in Zahl umwandeln?!
am 01.06.2006 18:57:26 von Daniel Fischer
Gerhard Wolf!
> int($p) wandelt einen String nicht in eine zahl um (ok steht auch so in
> der Doku)
Wo steht das?
Und wieso sollte sleep("2") nicht funktionieren?
Gruß
Daniel
Re: "2" in Zahl umwandeln?!
am 01.06.2006 22:31:49 von Slaven Rezic
Gerhard Wolf writes:
> Hallo,
>
> ich habe folgende Zeilen in meinem perl/Tk script:
>
> $mw->bind("",
> sub {
> my $w = shift;
> my $e = $w->XEvent;
>
> if ($e->K eq "0" || $e->K eq "1" || $e->K eq "2") {
> $pausezeit = $e->K;
> ...
> ...
> sleep($p); # geht nicht weil das gleich sleep("2")
>
> sleep(oct($p)); # geht aber damit kann ich die tasten 8 und 9
> nicht verwenden, denn die ergeben logischw. 0
>
> int($p) wandelt einen String nicht in eine zahl um (ok steht auch so
> in der Doku)
>
> Aber Welche Funktion nehme ich jetzt?
>
sleep() verwendet man sowieso nicht in Tk, weil damit die gesamte
GUI blockiert wird und nicht einmal Redraws funktionieren. Besser wäre
folgendes:
=head2 tk_sleep
=for category Tk
$top->tk_sleep($s);
Sleep $s seconds (fractions are allowed). Use this method in Tk
programs rather than the blocking sleep function. The difference to
$top->after($s/1000) is that update events are still allowed in the
sleeping time.
=cut
sub Tk::Widget::tk_sleep {
my($top, $s) = @_;
my $sleep_dummy = 0;
$top->after($s*1000,
sub { $sleep_dummy++ });
$top->waitVariable(\$sleep_dummy)
unless $sleep_dummy;
}
--
Slaven Rezic - slaven rezic de
Start a WWW browser - OS independent:
http://user.cs.tu-berlin.de/~eserte/src/perl/WWWBrowser/
Re: "2" in Zahl umwandeln?!
am 02.06.2006 10:12:01 von Ingo Menger
Gerhard Wolf wrote:
> Hallo,
>
> ich habe folgende Zeilen in meinem perl/Tk script:
>
> $mw->bind("",
> sub {
> my $w = shift;
> my $e = $w->XEvent;
>
> if ($e->K eq "0" || $e->K eq "1" || $e->K eq "2") {
> $pausezeit = $e->K;
> ...
> ...
> sleep($p); # geht nicht weil das gleich sleep("2")
Was steht denn in $p? Und was ist an sleep(2) denn so schlimm?
> Aber Welche Funktion nehme ich jetzt?
$p+0, dies ist aber eher eine Form der Selbst-Dokumentation: Hier
erwarte ich in $p etwas, das als Zahl interpretiert werden kann. (Und
das gibt dann auch eine Warnung, wenn Warnungen eingeschaltet sind und
dies nicht der Fall ist.)
Re: "2" in Zahl umwandeln?!
am 02.06.2006 11:13:18 von Gerhard Wolf
Ingo Menger schrieb:
> Gerhard Wolf wrote:
>> Hallo,
>>
>> ich habe folgende Zeilen in meinem perl/Tk script:
>>
>> $mw->bind("",
>> sub {
>> my $w = shift;
>> my $e = $w->XEvent;
>>
>> if ($e->K eq "0" || $e->K eq "1" || $e->K eq "2") {
>> $pausezeit = $e->K;
print Data::Dumper::Dumper( $pausezeit );
print Data::Dumper::Dumper( $pausezeit*1000 );
>> ...
>> ...
>> sleep($p); # geht nicht weil das gleich sleep("2")
>
> Was steht denn in $p? Und was ist an sleep(2) denn so schlimm?
>
>> Aber Welche Funktion nehme ich jetzt?
>
> $p+0, dies ist aber eher eine Form der Selbst-Dokumentation: Hier
> erwarte ich in $p etwas, das als Zahl interpretiert werden kann. (Und
> das gibt dann auch eine Warnung, wenn Warnungen eingeschaltet sind und
> dies nicht der Fall ist.)
>
Ich habe mal
print Data::Dumper::Dumper( $pausezeit );
print Data::Dumper::Dumper( $pausezeit*1000 );
nach dem drücken einer Zahl '3' auf der Tastatur wird:
$VAR1 = '3';
$VAR1 = 0; ??? warum 0 ?
ausgegeben.
Eine Warnung bzw. ein Fehler tritt nicht auf auch mit 'use warnings' nicht!
Re: "2" in Zahl umwandeln?!
am 02.06.2006 16:16:29 von Ingo Menger
Gerhard Wolf wrote:
> Ingo Menger schrieb:
> > Gerhard Wolf wrote:
> >> Hallo,
> >>
> >> ich habe folgende Zeilen in meinem perl/Tk script:
> >>
> >> $mw->bind("",
> >> sub {
> >> my $w =3D shift;
> >> my $e =3D $w->XEvent;
> >>
> >> if ($e->K eq "0" || $e->K eq "1" || $e->K eq "2") {
> >> $pausezeit =3D $e->K;
> print Data::Dumper::Dumper( $pausezeit );
> print Data::Dumper::Dumper( $pausezeit*1000 );
> >> ...
> >> ...
> >> sleep($p); # geht nicht weil das gleich sleep("2")
> >
> > Was steht denn in $p? Und was ist an sleep(2) denn so schlimm?
> >
> >> Aber Welche Funktion nehme ich jetzt?
> >
> > $p+0, dies ist aber eher eine Form der Selbst-Dokumentation: Hier
> > erwarte ich in $p etwas, das als Zahl interpretiert werden kann. (Und
> > das gibt dann auch eine Warnung, wenn Warnungen eingeschaltet sind und
> > dies nicht der Fall ist.)
> >
> Ich habe mal
>
> print Data::Dumper::Dumper( $pausezeit );
> print Data::Dumper::Dumper( $pausezeit*1000 );
>
> nach dem drücken einer Zahl '3' auf der Tastatur wird:
>
> $VAR1 =3D '3';
> $VAR1 =3D 0; ??? warum 0 ?
Ja, das ist rätselhaft, denn
perl -we "print '2'*1000+'6', qq{\n};"
2006
Re: "2" in Zahl umwandeln?!
am 02.06.2006 17:55:16 von Christian Winter
Ingo Menger schrieb:
>> print Data::Dumper::Dumper( $pausezeit );
>> print Data::Dumper::Dumper( $pausezeit*1000 );
>>
>> nach dem drücken einer Zahl '3' auf der Tastatur wird:
>>
>> $VAR1 = '3';
>> $VAR1 = 0; ??? warum 0 ?
>
> Ja, das ist rätselhaft, denn
>
> perl -we "print '2'*1000+'6', qq{\n};"
> 2006
Scheinbar ein Bug im C-Teil von Perl-Tk. Mal mit Devel::Peek
auf den Rückgabewert von XEvent()->K geschaut:
SV = PVIV(0x1b7d51c) at 0x1c1a0ac
REFCNT = 1
FLAGS = (PADBUSY,PADMY,IOK,POK,pIOK,pPOK)
IV = 0
^^^^^^^^^^
Da kommt die Variable schon falsch angeflogen!
PV = 0x1cb493c "4"\0
CUR = 1
LEN = 2
Zum Vergleich wie's sein sollte:
X:\>perl -MDevel::Peek -e "my $x = '3'; Dump($x); $x + 1; Dump($x)"
SV = PV(0x22673c) at 0x225920
REFCNT = 1
FLAGS = (PADBUSY,PADMY,POK,pPOK)
PV = 0x182343c "3"\0
CUR = 1
LEN = 2
SV = PVIV(0x22776c) at 0x225920
REFCNT = 1
FLAGS = (PADBUSY,PADMY,IOK,POK,pIOK,pPOK)
IV = 3
PV = 0x182343c "3"\0
CUR = 1
LEN = 2
---------------------------------------------------------
Also vermutlich ein wenig schwieriger zu finden. Ich habe die Frage
mal nach comp.lang.perl.tk rübergeschoben
-Christian
Re: "2" in Zahl umwandeln?!
am 02.06.2006 23:33:34 von Slaven Rezic
Christian Winter writes:
> Ingo Menger schrieb:
> >> print Data::Dumper::Dumper( $pausezeit );
> >> print Data::Dumper::Dumper( $pausezeit*1000 );
> >>
> >> nach dem drücken einer Zahl '3' auf der Tastatur wird:
> >>
> >> $VAR1 = '3';
> >> $VAR1 = 0; ??? warum 0 ?
> > Ja, das ist rätselhaft, denn
> > perl -we "print '2'*1000+'6', qq{\n};"
> > 2006
>
> Scheinbar ein Bug im C-Teil von Perl-Tk. Mal mit Devel::Peek
> auf den Rückgabewert von XEvent()->K geschaut:
> SV = PVIV(0x1b7d51c) at 0x1c1a0ac
> REFCNT = 1
> FLAGS = (PADBUSY,PADMY,IOK,POK,pIOK,pPOK)
> IV = 0
> ^^^^^^^^^^
> Da kommt die Variable schon falsch angeflogen!
Der Wert von IV alleine reicht nicht, FLAGS=IOK zeigt an, dass IV auch
verwendet werden soll.
> PV = 0x1cb493c "4"\0
> CUR = 1
> LEN = 2
>
K gibt einen Keysym zurück, also einen String. Das ist hier richtig.
Weiterhin scheint es wohl von Nick Ing-Simmons gewollt zu sein,
dass der Rückgabewert genau wie $! ein "dualvar" ist. Was der
nummerische Anteil bedeuten soll, kann ich auf die Schnelle nicht
herausfinden. Im Sourcecode findet man die entsprechende Stelle in
pTk/mTk/generic/tkBind.c, Funktion Tk_EventInfo. Im dortigen switch
gibt es gotos auf die Labels doNumeric, doString und doBoth, wobei
beim Letzteren ein dualvar entsteht.
Um den String-Anteil eines dualvars zu erhalten und als nummerischen
Wert zu interpretieren, muss man die Variable paradoxerweise in Quotes
setzen:
#!perl
use Devel::Peek;
use Scalar::Util qw(dualvar);
$dualvar = dualvar 1, "2";
Dump $dualvar;
$x = "$dualvar"; # Trick
Dump $x;
__END__
SV = PVNV(0x8176f2c) at 0x8147790
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 1
NV = 0
PV = 0x8119120 "2"\0
CUR = 1
LEN = 2
SV = PV(0x811a508) at 0x811c80c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x8119390 "2"\0
CUR = 1
LEN = 2
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tkrevdiff - graphical display of diffs between revisions (RCS, CVS or SVN)
http://ptktools.sourceforge.net/#tkrevdiff
Re: "2" in Zahl umwandeln?!
am 04.06.2006 00:47:07 von Christian Winter
Slaven Rezic schrieb:
> Christian Winter writes:
>
[PVIV mit Integerwert != Stringinhalt]
>
> Der Wert von IV alleine reicht nicht, FLAGS=IOK zeigt an, dass IV auch
> verwendet werden soll.
>
[...]
>
> K gibt einen Keysym zurück, also einen String. Das ist hier richtig.
> Weiterhin scheint es wohl von Nick Ing-Simmons gewollt zu sein,
> dass der Rückgabewert genau wie $! ein "dualvar" ist. Was der
> nummerische Anteil bedeuten soll, kann ich auf die Schnelle nicht
> herausfinden. Im Sourcecode findet man die entsprechende Stelle in
> pTk/mTk/generic/tkBind.c, Funktion Tk_EventInfo. Im dortigen switch
> gibt es gotos auf die Labels doNumeric, doString und doBoth, wobei
> beim Letzteren ein dualvar entsteht.
Hi, danke für die Ausführung. So ein dualvar war mir bisher
noch nicht bewusst über den Weg gelaufen - bzw. keiner ausser
dem von Dir erwähnten $!, wobei hier die Doku kaum zu überlesen
ist. Die Perl/Tk-Doku auf meinem System schweigt sich zu dem
Thema leider aus, aber das ganze hat mich neugierig gemacht.
Werd mir die Sourcen mal genauer anschauen.
> Um den String-Anteil eines dualvars zu erhalten und als nummerischen
> Wert zu interpretieren, muss man die Variable paradoxerweise in Quotes
> setzen:
>
[...code snipped...]
Das ist dann wieder einleuchtend. Je nach Kontext wird ja nur der
jeweils passende Wertetyp aus der struct kopiert.
Viele Grüße
Christian