PurePerl »»» Implementierung von Perl in PB

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ Nero:

Code: Alles auswählen

sub stringfield { return 0 || (split(("$_[2]"|" "), $_[0]))[$_[1] - 1] if($_[1]); } 
Warum returnst du "0 oder Ergebnis" warum nicht "Ergebnis oder '' "?
Und ich würde mal wagen zu behaupten, dass du bei split ein | vergessen hast ("$_[2] ||" "), das mit dem Ersatz-Trenner, wenn keiner Angegeben ist, ist eine hervorragende Idee :allright:

Ansonsten durchschaue ich das jetzt, ich finde deine Notation sehr raffiniert!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Du meinst Funktionen von Perl nach PB. An umgekehrt werden wohl nur
wenige Interesse haben :freak:

Man kann Perl in C-Programmen integrieren, per Embedded Perl. Dies
funktioniert selbstverständlich auch mit PB, abgesehen davon das man evtl.
die "perl58.dll" mitliefern müßte.

Das verstehe ich unter dem Titel, bzw. sowas meinte auch Kiffi. Perl
Funktionen nachprogrammieren, hat ausser Dir wohl keiner gemeint.

>> Ansonsten durchschaue ich das jetzt, ich finde deine Notation sehr raffiniert!
Nicht raffiniert, sondern unlesbar, einer Hochsprache nicht würdig :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Es ist natürlich auf den ersten Blick schwierig, das Konstrukt zu entschlüsseln.
Für Nero, der es ja selbst geschrieben hat, ist es lesbar, denn er wweiß ja, was er da fabriziert.

Für Außenstehende wie mich und dich, ist es auf den ersten Blick verwirrend, denn so eingearbeitet in Perl bin ich auch noch nicht, als dass ich sofort erkannt hätte, dass Nero in seiner StringField-Funktion mit Arrays arbeitet ohne dies deklariert zu haben:
split liefert den aufgeteilten String als Array zurück, Nero setzt den split-Aufruf in Klammern:
> (split( ... ))
und hängt noch einen Index dran, so geht die Rückgabe nicht verloren, denn
> (split( ... ))[5]
beispielsweise ergibt das 5. Feld (der Index in [Klammern] ist nämlich 4), das wiederum sofort an return übergeben wird. Wie geil ich hyperventiliere gleich... :lol: Ich finde das total raffiniert, dass ich nicht darauf gekommen bin, sieht man daran, dass meine StringField-Perl-Funktion mehrere Zeilen enthält.

@ Nero: hast du noch so einiges auf Lager, dass du mir beibringen könntest? :D

Bei deiner ExamineDirectory-Sub habe ich aber noch eine Frage: Du inkrementierst $i und setzt es dann als Index ein; wird nun erst inkrementiert und dann das Ergebnis als Index für das Array verwendet oder umgekehrt?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

So sieht embedded Perl in C aus:

Code: Alles auswählen

#include <EXTERN.h>
#include <perl.h>

static PerlInterpreter *my_perl;

main (int argc, char **argv, char **env)
{
         char *embedding[] = { "", "-e", "0" };
         my_perl = perl_alloc();
         perl_construct(my_perl);
         perl_parse(my_perl, NULL, 3, embedding, NULL);
         perl_run(my_perl);
         perl_eval_pv("print qq(Hello World - I come from the planet
C and i am -$0-\n);", TRUE);
         perl_destruct(my_perl);
         perl_free(my_perl);
}
Dafür brauchen wir nur einen Wrapper für die DLL oder ein Import der Lib.
Mir fehlen die nötigen Perl-Kenntnisse um das später zu testen, sowie Zeit
und Interesse an Perl.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Vielleicht bin ich ja blöd, aber ich weiß echt nicht, was du mir da zu vermitteln versuchst. Wohl, dass du Perl in PB einbetten willst, nicht aber, was dein Code zu bedeuten hat... :freak:
Bin sowieso nicht auf der Höhe der Zeit, da ich momentan krank bin.



Hätte hier mal beispielsweise eine Funktion von Perl nach PB portiert: split()

Code: Alles auswählen

Procedure splitStringToArray(Array.s(1), String.s, Separator.s=" ")
	string+Separator
	Protected n, num=CountString(String, Separator)
	ReDim Array.s(num-1)
	For n=1 To num
		Array(n-1)=StringField(String, n, Separator)
	Next
	ProcedureReturn num
EndProcedure


Dim woerter.s(51)
anzahl=splitStringToArray(woerter(), "I love PureBasic")

For n=0 To anzahl-1
	Debug woerter(n)
Next
Teilt einen String anhand eines Trennzeichens auf und speichert die Teilstrings in Arrays. Das Trennzeichen darf nur ein Zeichen umfassen (bedingt durch StringField).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Wohl, dass du Perl in PB einbetten willst
Was denn sonst? Oder willste die fast 1500 Funktionen in PB nachbilden?
Das ist ja in Perl so vorgesehen! Zwar gibts da fertiges nur für C und C++,
aber DLLs und statische Libs funktionieren auch mit PB.

Sinnvoll ist es nur, wenn man PerlSkripte in seinen Code einbettet, bzw. auch
externe Perl-Skripte ausführen kann. So wie Lua z.B.

Eine Handvoll Funktionen nachzubilden bringt doch fast garnichts.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Achso. Dass DLLs mit PB funktionieren, ist ja logisch. Aber mit diesen "statischen Libs" kann ich nichts anfangen; ich vermute mal, diese "statischen Libs", sind diese *.h und *.c Dateien, nicht wahr? Habe mal ein ZIp-Archiv mit sowas gesehen, konnte damit aber nichts anfangen.

> Eine Handvoll Funktionen nachzubilden bringt doch fast garnichts.
So gesehen hast du Recht. Warum nachbilden wenn man alles auf einmal importieren kann?
Dennoch war dies mein erster Gedanke, deshalb habe ich diesen Thread ja auch eröffnet. Natürlich will ich nicht wahllos irgendwelche Funktionen importieren, sondern nur die interessanten. Die interessanten Funktionen sind IMHO die, die Perl so mächtig machen (finde ich), beispielsweise solche, die zum Kapitel String gehören.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Also Perl in PB wäre ja mal echt ne nette Idee
vorallem weil Perl in sachen Textverarbeitung PB um längen schlägt
Bei deiner ExamineDirectory-Sub habe ich aber noch eine Frage: Du inkrementierst $i und setzt es dann als Index ein; wird nun erst inkrementiert und dann das Ergebnis als Index für das Array verwendet oder umgekehrt?
Es wird immer erst $i gesetzt danach ++ wen es anderst wäre würde ja der array bei [0] leer sein <)
@ Nero: hast du noch so einiges auf Lager, dass du mir beibringen könntest?
Uff wüste nicht was ich dir da beibringen könnte hab shon über 2Jahre nix
mehr in Perl gemacht.
Vieleicht noch nen kleiner tip zum if sparen aber denke da biste schon selbst draufgekommen.

Code: Alles auswählen

sub error{ print $_[0]; exit();}
#$Test_1 = "ich bin der text";
$Test_2 = $Test_1 || error("bin die error sub");
print $Test_2 . "\n";
So kannste ab und an IF anweisungen sparen ist ganz praktisch wen man
was mit %ENV macht etc.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

AND51 hat geschrieben:Aber mit diesen "statischen Libs" kann ich nichts anfangen; ich vermute mal, diese "statischen Libs", sind diese *.h und *.c Dateien, nicht wahr? Habe mal ein ZIp-Archiv mit sowas gesehen, konnte damit aber nichts anfangen.
Statische Libs enden mit lib oder a, nicht mit h oder c

*.c sind C-Sourcen, *.h sind Header-Dateien (Includes mit definitionen
von Funktionen, Structuren, Konstanten usw., sowas sollte man Wissen!)

Die statische Lib brauchste ja nicht verwenden, die DLL genügt, wobei das
direkte zugreifen auf eine DLL dynamische Bindung (late Binding) und
über statische Lib ist es eine frühe Bindung (so sind die ganzen
API-Funktionen in PB eingebunden))
AND51 hat geschrieben:
> Eine Handvoll Funktionen nachzubilden bringt doch fast garnichts.
So gesehen hast du Recht. Warum nachbilden wenn man alles auf einmal importieren kann?
Dennoch war dies mein erster Gedanke, deshalb habe ich diesen Thread ja auch eröffnet. Natürlich will ich nicht wahllos irgendwelche Funktionen importieren, sondern nur die interessanten. Die interessanten Funktionen sind IMHO die, die Perl so mächtig machen (finde ich), beispielsweise solche, die zum Kapitel String gehören.
Die meisten dieser Funktionen wurden schon des öfteren nachgebildet,
z.B. in ASM von Deem (php enthält ja in etwa dieselben Funktionen) oder
auch in Sourcen, siehe Dein langsames Beispiel (StringField in einer
Schleife dauert ja ewig :mrgreen: )
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ TS-Soft: Achso. Ja gut, wenn die DLL genügt, dann kann man die ja auch verwenden, denke ich. So würde ich es tun.
> Statische Libs enden mit lib oder a, nicht mit h oder c
Ich hatte noch nie was damit zu tun gehabt, daher kenne ich mich da nicht so mit aus. Hab zwar sowas schon mal gesehen, aber naja.

@ Nero:
> wen es anderst wäre würde ja der array bei [0] leer sein
Eben das war ja mein Gedanke. Abr wenn erst $i gesetzt wird...

> So kannste ab und an IF anweisungen sparen
Ja, das kenne ich bereits, z. B. wenn das Öffnen einer Datei fehlschlägt:

Code: Alles auswählen

open(COUNTER, "<db/counter/counter.txt") || die "Datei kann nicht geöffnet werden: $!";
Frage: DU kennst doch sicherlich || und or. Warum kann ich das hier nicht schreiben:

Code: Alles auswählen

sub irgendewas
{
my $param1=shift || "Alternative"; # geht
my $param2=shift or "alternative"; # geht nicht, man muss immer || nehmen...?
}
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten