Iemand een idee hoe ik dat voorelkaar kan krijgen?
GG Kees -- Q: Why did Captain Kirk piss on the bridge? A: He wanted to boldly go where no man had gone before! Visit me @ http://www.xs4all.nl/~kostercd/ | ICQ #179658498 -- # EOE
Hij werkt nog niet geheel zoals het moet maar hiermee kom ik er wel.
GG Kees -- I am myself plus my circumstance, and if I do not save it, I cannot save myself. -- Jos' e Ortega Y Gasset Visit me @ http://www.xs4all.nl/~kostercd/ | ICQ #179658498 -- # EOE
-- KP Ik krijg overigens uitsluitend virussen van mensen met een virusscanner. Mensen zonder virusscanner sturen mij nooit virussen. Gek he? --- V. Sessink in nl.comp.os.linux.overig
AAAAARRRRGHHHH!!!! 'dorie John, hou daar nu eens me op!
-- KP Ik krijg overigens uitsluitend virussen van mensen met een virusscanner. Mensen zonder virusscanner sturen mij nooit virussen. Gek he? --- V. Sessink in nl.comp.os.linux.overig
> John Bokma: >>> ($be, $ae) = split /=/, $line; >> dus hier: my ( $be, $ae ) > Nee, want dan haal je de my binnen de loop. En bij een loop van > een miljoen, wil je die er echt buiten hebben :-p
Zou je denken? In sommige talen klopt je denkrichting wel, maar in andere (gecompileerde) talen wordt op die manier de variabele nog steeds maar eenmalig opgezet, en daarmee beperk je zo mooi de scope van die variabele, want hij is echt 'weg' (onbereikbaar) na de loop.
De vraag is dus: hoe doet perl het. En perl doet het precies zoals John impliceerde:
A declaration can be put anywhere a statement can, but has no effect on the execution of the primary sequence of statements -- declarations all take effect at compile time. Typically all the declarations are put at the beginning or the end of the script. However, if you're using lexically-scoped private variables created with my(), you'll have to make sure your format or subroutine definition is within the same block scope as the my if you expect to be able to access those private variables.
Ofwel: alle declaraties worden door de compiler gedaan alsof ze voorin staan. De scope van de door 'my()' gemaakte variabelen is beperkt tot de block-scope van het block waarin ze staan.
Dr.Ruud <rvtol+n...@isolution.nl>: > A declaration can be put anywhere a statement can, but has no effect > on the execution of the primary sequence of statements -- declarations > all take effect at compile time.
$ perl bench 100 Benchmark: timing 100 iterations of in loop, out loop... in loop: 11 wallclock secs (10.03 usr + 0.00 sys = 10.03 CPU) @ 9.97/s (n=100) out loop: 6 wallclock secs ( 5.54 usr + 0.00 sys = 5.54 CPU) @ 18.05/s (n=100)
De code: 'in loop' => sub { for (my $i = 0; $i < $num; $i++) { my ($a, $b); } } 'out loop' => sub { my ($a, $b); for (my $i = 0; $i < $num; $i++) { } } ($num = 100000, v5.8.1-RC3)
> Ofwel: alle declaraties worden door de compiler gedaan alsof ze voorin > staan. De scope van de door 'my()' gemaakte variabelen is beperkt tot de > block-scope van het block waarin ze staan.
En kennelijk kost de check of een variabele in scope is of niet toch wel enige rekenkracht.
> Ofwel: alle declaraties worden door de compiler gedaan alsof ze > voorin staan. De scope van de door 'my()' gemaakte variabelen > is beperkt tot de block-scope van het block waarin ze staan.
Klopt. Maar zoals robert terecht al liet ziet, het punt is niet de feitelijke declaratie, maar het bepalen van de scope.
Koos -- 43rd Law of Computing: Anything that can go wr fortune: Segmentation violation -- Core dumped
robert wrote: > Dr.Ruud <rvtol+n...@isolution.nl>: > > A declaration can be put anywhere a statement can, but has no effect > > on the execution of the primary sequence of statements -- > > declarations all take effect at compile time.
> De code: > 'in loop' => sub { for (my $i = 0; $i < $num; $i++) { my ($a, $b); } > } 'out loop' => sub { my ($a, $b); for (my $i = 0; $i < $num; $i++) { > } } ($num = 100000, v5.8.1-RC3)
> > Ofwel: alle declaraties worden door de compiler gedaan alsof ze > > voorin staan. De scope van de door 'my()' gemaakte variabelen is > > beperkt tot de block-scope van het block waarin ze staan.
> En kennelijk kost de check of een variabele in scope is of niet toch > wel enige rekenkracht.
Dr.Ruud wrote: > Toen ik robert kietelde, kwam er dit uit:
>> En kennelijk kost de check of een variabele in scope is of niet >> toch wel enige rekenkracht.
> Aha. Ik heb het net ook maar eens uitgeprobeerd, en het gaat zelfs > nog verder: de my-variabele wordt bij elke passage opnieuw opgezet, > met waarde 0.
undef zal je bedoelen, en ja, dat klopt :-D, sterker daar is niks mis mee. En buiten het block waarin je ze definieert kan je ze niet meer gebruiken.
> Dr.Ruud: >> robert: >>> En kennelijk kost de check of een variabele in scope is of niet >>> toch wel enige rekenkracht. >> Aha. Ik heb het net ook maar eens uitgeprobeerd, en het gaat zelfs >> nog verder: de my-variabele wordt bij elke passage opnieuw opgezet, >> met waarde 0. > undef zal je bedoelen, en ja, dat klopt :-D, sterker daar is niks > mis mee.
Je hebt in Perl dus een extra laag {} nodig om het 'netjes' te krijgen: (netjes als in: de variabelen zijn na het block waarin ze gebruikt worden, per direct niet meer beschikbaar)
{ my ($a, $b) = (0, 0); while (busy()) { $a++; $b += $a; print "$b "; } }
Een my in de for() veroorzaakt blijkbaar iets verborgens, dus dit:
Dr.Ruud wrote: > Toen ik John Bokma kietelde, kwam er dit uit: >> Dr.Ruud: >>> robert:
>>>> En kennelijk kost de check of een variabele in scope is of niet >>>> toch wel enige rekenkracht.
>>> Aha. Ik heb het net ook maar eens uitgeprobeerd, en het gaat zelfs >>> nog verder: de my-variabele wordt bij elke passage opnieuw opgezet, >>> met waarde 0.
>> undef zal je bedoelen, en ja, dat klopt :-D, sterker daar is niks >> mis mee.
> Je hebt in Perl dus een extra laag {} nodig om het 'netjes' te > krijgen: (netjes als in: de variabelen zijn na het block waarin ze > gebruikt worden, per direct niet meer beschikbaar)
Dat kan, en soms zie ik dat inderdaad wel eens, a la
{ local ... ...
} > Een my in de for() veroorzaakt blijkbaar iets verborgens, dus dit:
> for (my $i = 0; $i < 10; $i++) { ...; }
> is eigenlijk dit:
> { my $i; > for ($i = 0; $i < 10; $i++) { > ...; > } }
Yup, en heel handig dus. Aan de andere kant, in 99 van de 100 Perl scripts zal je geen for zien op die manier :-D.
Er zullen wel wat niet zulk mooie constructies inzitten maar tis m'n eerste Perl progje, ga vanmiddag naar de bieb een Perl boek zoeken.
GG Kees -- momentum, n.: What you give a person when they are going away. 11:12:05 up 2 days, 1:47, 4 users, load average: 0.27, 0.07, 0.05 Visit me @ http://www.xs4all.nl/~kostercd/ | ICQ #179658498 -- # EOE
Kan wel. Maar mooier is een extra isolatie block. Voor de programmeur is eea daarmee netter afgewerkt. (In dit specifieke geval maakt het voor Perl niets uit.)
{ use integer; ... }
> $volume = $volume / $factor; > print OF $bl; > print OF "="; > print OF join "", map {"$_,"} @numbers; > print OF $volume; > print OF "\n";
Of in een regel natuurlijk:
print OF "$bl=".join ("", map {"$_,"} @numbers).($volume/4)."\n";
> Er zullen wel wat niet zulk mooie constructies inzitten maar tis > m'n eerste Perl progje, ga vanmiddag naar de bieb een Perl boek > zoeken.
"Learning Perl". Of als je't aandurft: "Programming Perl".
Succes.
-- KP Ik krijg overigens uitsluitend virussen van mensen met een virusscanner. Mensen zonder virusscanner sturen mij nooit virussen. Gek he? --- V. Sessink in nl.comp.os.linux.overig
> Dr.Ruud: >> Een my in de for() veroorzaakt blijkbaar iets verborgens, dus dit:
>> for (my $i = 0; $i < 10; $i++) { ...; }
>> is eigenlijk dit:
>> { my $i; >> for ($i = 0; $i < 10; $i++) { >> ...; >> } } > Yup, en heel handig dus.
Ja, maar wel verhullend, want de scope van de $var die in de for() (of in de foreach) staat, heeft dan niet de scope van de zichtbare {} waar hij tussen staat:
use strict;
sub demo { foreach my $text ("A", "B", "C") { print "text=$text\n"; } print "text=$text\n"; # compilation-error }
demo();
> Aan de andere kant, in 99 van de 100 Perl > scripts zal je geen for zien op die manier :-D.
Als perl het al voor je doet, hoef je het niet zelf meer te doen. Maar een rammelende syntax blijft het. Kan er even iemand dit (op theoretische wijze) met C++ vergelijken? Zoiets als:
for (int i; i < 10; i++) { int a++; int b += a; cout << "a=", a, ", b=", b, '\n'; }
Dr.Ruud wrote: > Toen ik John Bokma kietelde, kwam er dit uit:
[ snip for ( my ... ]
> Ja, maar wel verhullend, want de scope van de $var die in de for() > (of in de foreach) staat, heeft dan niet de scope van de > zichtbare {} waar hij tussen staat:
Dat is idem in Java, idem in C/C++, en wellicht nog in een aantal andere talen precies hetzelfde :-D.
>> Aan de andere kant, in 99 van de 100 Perl >> scripts zal je geen for zien op die manier :-D.
> Als perl het al voor je doet, hoef je het niet zelf meer > te doen.
Ik bedoel dus een for met een index, meestal gebruik je dingen als:
for my $item ( @array ) { .. }
> Maar een rammelende syntax blijft het.
Je bedoelt het beperken van de scope of het resetten van de vars binnen de lus?
> >> Toen ik John Bokma kietelde, kwam er dit uit: > > [ snip for ( my ... ] >> Ja, maar wel verhullend, want de scope van de $var die in de for() (of >> in de foreach) staat, heeft dan niet de scope van de zichtbare {} waar >> hij tussen staat: > > Dat is idem in Java, idem in C/C++, en wellicht nog in een aantal andere > talen precies hetzelfde :-D.
Ik heb m'n vingers wel eens gebrand aan vergelijkbare code in Javascript: for (var i = 0; i < 10; i++) { ... }
Daarmee declareer je een variabele 'i' die binnen het blok dat de for-lus omvat geldig is, i.t.t. Perl, Java en C/C++ waar 'i' alleen in op het for-statement-volgende blok geldig is.
robert wrote: > Ik heb m'n vingers wel eens gebrand aan vergelijkbare code in > Javascript: > for (var i = 0; i < 10; i++) { ... }
> Daarmee declareer je een variabele 'i' die binnen het blok dat de > for-lus omvat geldig is, i.t.t. Perl, Java en C/C++ waar 'i' alleen in > op het for-statement-volgende blok geldig is.
Auw, en schande! Ik doe mijn best om dat te onthouden, want daar zou ik ook instinken :-(
> Er zullen wel wat niet zulk mooie constructies inzitten maar tis m'n > eerste Perl progje, ga vanmiddag naar de bieb een Perl boek zoeken.
Probeer Learning Perl (O'Reilly) en Perl Cookbook (O'Reilly) te pakken te krijgen.
[1] recent gehad dat dit echt faalde, de buffer werd door de close weg geschreven, en .... er was geen ruimte meer op de HD :-D. Als je het helemaal mooi wilt doen: ( print ...... ) or die ...
In article <newscache$30yeci$h2...@news.emea.compuware.com>, Koos Pol wrote:
[...]
> "Learning Perl". Of als je't aandurft: "Programming Perl".
> Succes.
De bovenstaande hadden ze niet, tis "Perl in 24 uur" geworden van Clinton Pierce.
John en Koos bedankt voor de tips en correcties.
GG Kees -- Better hope you get what you want before you stop wanting it. 21:15:55 up 2 days, 11:50, 4 users, load average: 0.06, 0.18, 0.31 Visit me @ http://www.xs4all.nl/~kostercd/ | ICQ #179658498 -- # EOE
Dr.Ruud wrote: > Toen ik John Bokma kietelde, kwam er dit uit: >> Dr.Ruud:
>>> Maar een rammelende syntax blijft het.
>> Je bedoelt het beperken van de scope of het resetten >> van de vars binnen de lus?
> De 'implied braces'. (0 hits op google)
Er zijn meer talen die dat doen (Java, C, C++), dus ik zie het probleem niet. Kwalijker (vind ik) is wat robert als voorbeeld gaf, dat de variable ineens leeft buiten de lus, dus: