Schrift
[thread]6341[/thread]

abgedrehtes problem mit switch: oder bin ich blind? (Seite 7)



<< |< 1 ... 4 5 6 7 8 >| >> 72 Einträge, 8 Seiten
pq
 2004-07-07 17:56
#83490 #83490
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Dieter,07.07.2004, 15:39]@pq
Du kannst den BEGIN Block auch an das Ende des Scripts stellen.
Der Parser sucht zunächst einmal nach einem solchen Block/solchen Blöcken und ignoriert dabei alles was er 'vor' dem ersten BEGIN Block findet (so jedenfalls die einschlägige Literatur).
[/quote]
ich hab ja in meinem beispiel vorgeführt, dass z.b. ein my() nicht
ignoriert wird. ein my ist keine herkömmliche funktion, sondern eben auch
eine anweisung an den parser. wenn es ignoriert würde, würde das ganze
nicht mit strict laufen.
ansonsten versteh ich nicht (ich versteh's wirklich nicht), was du nun
für eine aussage machen möchtest.
mein beispiel mit strict laufen zu lassen hat jedenfalls keinen gedankenfehler
meinerseits offenbart.
ansonsten kannst du ja selbst einmal ein code-beispiel mit ausgabe posten,
um eine aussage von dir zu untermauern.

edit:
im übrigen ist es unmöglich, den rest des codes zu ignorieren und nur BEGIN
auszuführen. um einen BEGIN-block zu finden, musst du einfach den code
bis dahin geparsed haben. ein gezieltes suchen nach BEGIN {} würde
ja etwa auch
my $string = qq/
BEGIN {
 blabla
}/;

finden. und so verstehe ich auch die 'einschlägige literatur': der gesamte code
vor BEGIN ist schon geparsed.\n\n

<!--EDIT|pq|1089208892-->
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
 2004-07-07 18:07
#83491 #83491
Ich kann jetzt nur noch verweisen auf:
Programmieren mit Perl
Kapitel 18 - Kompilierung
insbesondere Seite: 498 bis 501

Edit:
P.S. das mit dem 'Ignorieren' war nicht so 'ganz' richtig von mir ausgedrückt.
Der Parser hat den Code natürlich vereinnahmt, aber die Compilierung/Ausführung erfolgt erst dann, wenn der BEGIN Block compiliert/ausgeführt worden ist.\n\n

<!--EDIT|Dieter|1089209555-->
Crian
 2004-07-07 18:09
#83492 #83492
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Und es wurde wirklich nur bis zum BEGIN geparsed (alles andere fände ich auch sehr eigenartig), wie folgendes Script zeigt:

Code: (dl )
1
2
3
4
5
#!/usr/bin/perl
use strict;
BEGIN { $x = 'aha' }
my $x;
print $x;


mit der nicht verwunderlichen Ausgabe

Code: (dl )
1
2
Global symbol "$x" requires explicit package name at C:\Daten\perl\BEGIN5.pl line 3.
BEGIN not safe after errors--compilation aborted at C:\Daten\perl\BEGIN5.pl line 3.
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
Gast Gast
 2004-07-07 18:14
#83493 #83493
[quote=Crian,07.07.2004, 16:09]Und es wurde wirklich nur bis zum BEGIN geparsed (alles andere fände ich auch sehr eigenartig), wie folgendes Script zeigt:

Code: (dl )
1
2
3
4
5
#!/usr/bin/perl
use strict;
BEGIN { $x = 'aha' }
my $x;
print $x;


mit der nicht verwunderlichen Ausgabe

Code: (dl )
1
2
Global symbol "$x" requires explicit package name at C:\Daten\perl\BEGIN5.pl line 3.
BEGIN not safe after errors--compilation aborted at C:\Daten\perl\BEGIN5.pl line 3.
[/quote]
eben ...
und es gilt zu unterscheiden zwischen
Parsen, Compilieren und Ausführen
wobei Perl auch zwischenzeitlich mal mogelt und zwischen Compiler und Interpreter switcht.\n\n

<!--EDIT|Dieter|1089209874-->
Crian
 2004-07-07 18:21
#83494 #83494
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=Dieter,07.07.2004, 16:07]Ich kann jetzt nur noch verweisen auf:
Programmieren mit Perl
Kapitel 18 - Kompilierung
insbesondere Seite: 498 bis 501
[/quote]

Um was zu verdeutlichen (außer dass wir anscheinend die gleichen Versionen dieses Buches haben ;-) ?

Vielleicht liegt es ja nur an mir, aber mir ist nicht ganz klar, was Du eigentlich aussagen möchtest, dass im Gegensatz zu pq's (oder meinen) Aussagen steht.

Das Beispiel auf Seite 498 (mit verschiedem INIT, CHECK, END etc-Blöcken) steht doch nicht im Widerspruch zu den hier gemachten Aussagen.

Bitte sag nochmal deutlich, was Du meinst =)

Denn ich habe das Gefühl, eigentlich meinen alle das gleiche, es gibt nur Kommunikationsprobleme.\n\n

<!--EDIT|Crian|1089210631-->
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
pq
 2004-07-07 18:27
#83495 #83495
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
@dieter: lassen wir's einfach. du antwortest nicht auf meine konkreten
fragen, ich verstehe nicht, was du eigentlich aussagen willst und was an meinen
aussagen falsch sein soll, und im grunde ist das diskutierte thema auch für
die tagtägliche programmierung irrelevant. EOT?
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
sri
 2004-07-07 18:38
#83496 #83496
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Crian,07.07.2004, 15:25]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use strict;
use warnings;

my $xxx = 1234;

BEGIN {
warn $xxx;
$xxx = 5678;
warn $xxx;
}

warn $xxx;
[/quote]
Wie ich schon sagte wird jeder BEGIN Block im string eval ausgeführt, das heisst, er kann auf Variablen der Umgebung zugreifen in der er ausgeführt wird.

Da Variablen bereits zur compiletime initialisiert werden kann darauf auch zugegriffen werden.

Der Compiler arbeitet den quelltext von oben nach unten ab, der BEGIN block wird genau dann ausgeführt wenn der compiler ihn zum ersten mal sieht.

Es ist also genau wie Crian sagt, und Dieter sollte lieber nochmal nachlesen. ;)
Gast Gast
 2004-07-07 18:38
#83497 #83497
[quote=Crian,07.07.2004, 16:21]Denn ich habe das Gefühl, eigentlich meinen alle das gleiche, es gibt nur Kommunikationsprobleme.[/quote]
Ja - denke ich auch ...
also EOT - wie pq schon sagte.

War aber wieder mal nett mit Euch über grundsätzliche Dinge zu plaudern. :)
Wir sollten das ab und an wiederholen. ;)
Gast Gast
 2004-07-07 18:50
#83498 #83498
[quote=sri,07.07.2004, 16:38]Wie ich schon sagte wird jeder BEGIN Block im string eval ausgeführt, das heisst, er kann auf Variablen der Umgebung zugreifen in der er ausgeführt wird.

Da Variablen bereits zur compiletime initialisiert werden kann darauf auch zugegriffen werden.

Der Compiler arbeitet den quelltext von oben nach unten ab, der BEGIN block wird genau dann ausgeführt wenn der compiler ihn zum ersten mal sieht.

Es ist also genau wie Crian sagt, und Dieter sollte lieber nochmal nachlesen. ;)[/quote]
Keinesfalls sri - der 'Parser' arbeitet den Code von oben nach unten ab und übergibt jeden BEGIN Block sofort an den 'Interpreter' zur Ausführung - That's the way it works ;)
Aber wie ich schon sagte - Let's call it a day.\n\n

<!--EDIT|Dieter|1089305064-->
sri
 2004-07-07 20:54
#83499 #83499
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Dieter,07.07.2004, 16:50]Keinesfalls sri - der 'Parser' arbeitet den Code von oben nach unten ab und übergibt jeden BEGIN Block sofort an den 'Compiler' zur Ausführung - That's the way it works ;)
Aber wie ich schon sagte - Let's call it a day.[/quote]
Also bitte, wem willst du hier was über Perl interna erzählen! :)

Was tut der Parser denn?
Genau, er übersetzt Perl Quelltext zu einem OP-Tree.
Wie nennt man den OP-Tree noch?
Genau, Bytecode.

Manche bezeichnen den Parser (toke.c, perly.y, op.c) als Translator andere als Compiler, wieder andere trennen zwischen Lexer/Tokenizer und Parser, definitionssache da alles einfach zu verwoben ist.

Aber vorallem möchte ich wissen von welchem Compiler du da redest an den der BEGIN block übergeben wird, das macht so wie du es schreibst einfach keinen sinn???

-spoiler------------------------------------------------------

Für die die es interessiert:

Also, der Lexer splittet den code in kleine schnipsel ("my $x = 1;") übergibt diese an den Parser (byacc) der daraus einen OP-Tree erstellt. (Nebenbei Variablen initialisiert etc.).

Bekommt der Parser (byacc) nun zufällig einen BEGIN Block zu fassen wird dieser in einem string eval erst vom Parser übersetzt , optimiert und dann vom Interpreter ausgeführt.

Nun, fährt der Parser mit der Arbeit fort und übersetzt weiter fleissig.
Ist er fertig wird der OP-Tree noch schnell optimiert und anschliessend vom Interpreter ausgeführt.

-/spoiler------------------------------------------------------

Halt dich nicht so an den einzelnen Worten in deinem Camel Buch fest, liess lieber mal perldoc perlhack, das Pantherbuch und Perl Quelltexte und find raus wie es wirklich funktioniert!

P.S.:
Meinst du das wirklich ernst was du so postest oder findest du es nur toll wenn die Leute sich mit dir beschäftigen?
Ich zweifle langsam...
<< |< 1 ... 4 5 6 7 8 >| >> 72 Einträge, 8 Seiten



View all threads created 2004-06-16 21:56.