Schrift
[thread]8780[/thread]

Datei innerhalb des Programmes: __END__, __DATA__

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
mike42
 2007-02-21 21:46
#74479 #74479
User since
2006-04-24
6 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich kenne die Möglichkeit den Bereich in einem Perl-Script nach __END__ bzw. __DATA__ auszulesen:

Code: (dl )
1
2
3
4
5
6
7
8
while( <main::DATA> ) {
print $_;
}

__END__
Zeile 1
Zeile 2
Zeile 3


Wie kann ich jetzt aber z.B. "Zeile 3" vom Code aus ändern oder eine "Zeile 4" hinzufügen?

mike42
GwenDragon
 2007-02-21 21:55
#74480 #74480
User since
2005-01-17
14788 Artikel
Admin1
[Homepage]
user image
Gar nicht. Du kannst ein laufendes Skript nicht im Quelltext modifizieren.
mike42
 2007-02-21 22:05
#74481 #74481
User since
2006-04-24
6 Artikel
BenutzerIn
[default_avatar]
Hallo GwenDragon,

klar kann sich ein Script selbst erweitern. :-)

Das Script z.B. fügt bei jedem Aufruf eine Zeile mit dem Text "test" an sich selbst an:

Code: (dl )
1
2
3
4
5
6
7
#!perl

open SCRIPT,">>$0";
print SCRIPT "test\n";
close SCRIPT;

__END__


mike42

PS: Du willst doch nicht sagen Perl könne etwas nicht ;-)
PPS: Ich würde das nur gern über den offiziellen Weg - also über <main::DATA> oder etwas ähnliches machen.\n\n

<!--EDIT|mike42|1172089189-->
Relais
 2007-02-21 23:38
#74482 #74482
User since
2003-08-06
2254 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hmm, kannst Dir mal CPAN:Inline::File anschaun.

Prinzipiell hat Gwendragon schon recht, denn das ausgeführte - das laufende Skript, und die Datei, in der ihr Quellcode drin steht, sind unterschiedliche Dinge.
Aber für's nächste Ausführen kann man natürlich die Datei ändern.

Um dabei den Quellcode während der Laufzeit noch zu ändern, braucht es andere Bandagen (frag mich nicht, ich weiß es gerade nicht).
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
Crian
 2007-02-22 10:22
#74483 #74483
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Du kannst DATA mit Seek auf den Anfang des Skripts oder wo auch immer hin zurücksetzen, ob du dann Zeilen einfügen kannst bzw. in wieweit sich die dann abarbeiten lassen... hmmm kannst du nicht ein zweites Skript erzeugen das du dann aufrufst?
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
docsnyder
 2007-02-22 11:05
#74484 #74484
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@mike42

Einer der bedeutensten Aspekte der Erfindung der "von Neumann"-Architektur ist die Trennung von Daten und Code. Bis auf einige Sonderfälle, die es geben mag, machst das ha auch Sinn und ist bis heute das bevorzugte Paradigma.

Insbesondere, wenn es um dynamische Daten geht, würde ich die Daten nicht im Code integriert haben wollen.

Ich kenne die Problemstellung Deines Scriptes nicht, daher meine Frage: wo siehst Du (in Deinem Fall) die Vorteile, Daten in den Code zu integrieren? (man will ja dazulernen)

Gruß, Doc\n\n

<!--EDIT|docsnyder|1172135210-->
Froschpopo
 2007-02-22 12:27
#74485 #74485
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich find das übrigens doof, dass das ENDE immer am Zeilenanfang stehen muss. Das sieht unstylist aus in meinem quelltext
Relais
 2007-02-22 12:39
#74486 #74486
User since
2003-08-06
2254 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Crian,22.02.2007, 09:22]Du kannst DATA mit Seek auf den Anfang des Skripts oder wo auch immer hin zurücksetzen, ob du dann Zeilen einfügen kannst bzw. in wieweit sich die dann abarbeiten lassen... hmmm kannst du nicht ein zweites Skript erzeugen das du dann aufrufst?[/quote]
och, exec $0 sollte schon gehen. Wenn man nicht so ein komisches BetrübssysteM$ hat, das einem das Datei besdchreiben während des Ausführens verbietet.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
mike42
 2007-02-22 12:41
#74487 #74487
User since
2006-04-24
6 Artikel
BenutzerIn
[default_avatar]
@Relais: Danke für die Info mit CPAN:Inline::File. Die Beschreibung passt schon sehr gut. Ich werde mir das mal genauer ansehen.

@Crian: Das werde ich auch mal ausprobieren. Im Prinzip könnte ich es ja auch mit meinem geposteten Beispiel machen. Den Quelltext über Regex prüfen und nach der Zeile mit __END__ anfangen zu schreiben. Allerdings dachte ich, ich hätte mal irgenwo gelesen, dass es dafür einen Standardweg gibt. Eventuell war es ja das CPAN:Inline::File Modul.

@docsnyder: Ich trenne normalerweise auch Daten und Code. Beim CPAN:Inline::File Modul wird quasi auch davor gewarnt es zu verwenden :-)

Ich habe eine Script das Daten aus einer XML-Datei ausliest und als CSV Datei schreibt. Die Titelzeile der CSV Datei in der die Spaltentitel stehen wollte ich kommasepariert in den Datenblock nach __END__ legen und dort - wenn notwendig - dynamisch vom Script erweitern lassen. Das soll dann geschehen wenn es neue Properties in der XML Datei gibt. Die kommaseparierten Spaltentitelzeile sollten dann dynamisch um diese erweitert werden.

mike42
docsnyder
 2007-02-22 12:53
#74488 #74488
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@mike42

O.K., ich habe soweit verstanden, was Du tun willst. Mir ist aber noch nicht klar, wo der Vorteil liegt, die Titelzeile an das Script anzuhängen anstatt sie in eine eigene Datei zu schreiben.

Gruss, Doc
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-02-21 21:46.