PurePerl »»» Implementierung von Perl in PB

Fragen zu allen anderen Programmiersprachen.
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 »

Hier noch die zugehörigen Fehlerkonstanten:

Code: Alles auswählen

Enumeration
  #plezNoError            ;	success
  #plezMoreSpace          ;	more space need To Return result
  #plezError              ;	returned error string in buffer
  #plezErrorMoreSpace     ;	more space need To Return error message
  #plezErrorBadFormat     ;	format string is invalid
  #plezException          ;	function call caused an exception
  #plezInvalidHandle      ;	hHandle was invalid
  #plezCallbackAlreadySet ;	second call To PerlEzSetMagicFunction fails
  #plezInvalidParams      ;	invalid parameter was passed To a routine
  #plezOutOfMemory        ;	cannot allocate more memory
EndEnumeration
Sollte jetzt komplett sein
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Achso falls Perl nicht installiert ist funktioniert das ganze natürlich nicht *g*

Man muß in dem fall noch die perl58.dll mit in das verzeichnis kopieren.

Man hat dann halt 2 dll's mit drin aber so funktioniert alles prima :) und es steht der verwendung von Perl in PB nix mehr im weg :mrgreen:

Bleibt also nur noch die Frage der Lizenz der PerlEz.dll da die ja nurn wrapper
ist wäre ja blöd wen man die nicht mit dem progie weitergeben dürfte.

EDIT:
Ah grad gesehen
The license also allows You to redistribute parts of the Package as part of an application generated by wrapping tools such as PAR, PerlApp or Perl2Exe. However, this License does not allow You to (a) redistribute the Package as a whole, (b) use its parts to create a language distribution, or (c) redistribute the PerlScript, Perl for ISAPI or PerlEx components with Your application.
Hm PerlEz wird nicht ausgeschlossen also sollte es ja zum ersten Satz zählen
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 »

Hab das ganze nochmal laut "PerlEz.h" vervollständig, 2 Funktionen sind wohl
nicht nutzbar, haben undifinierte Anzahl Parameter, das wird so von PB nicht
unterstützt, ich denke mal die sind nicht wichtig.

Hier die "PerlEz_Include.pbi"

Code: Alles auswählen

Enumeration
  #plezNoError            ;	success
  #plezMoreSpace          ;	more space need To Return result
  #plezError              ;	returned error string in buffer
  #plezErrorMoreSpace     ;	more space need To Return error message
  #plezErrorBadFormat     ;	format string is invalid
  #plezException          ;	function call caused an exception
  #plezInvalidHandle      ;	hHandle was invalid
  #plezCallbackAlreadySet ;	second call To PerlEzSetMagicFunction fails
  #plezInvalidParams      ;	invalid parameter was passed To a routine
  #plezOutOfMemory        ;	cannot allocate more memory
EndEnumeration

Import "PerlEz.lib"
  PerlEzCreate(lpFileName.s = "", lpOptions.s = "") As "_PerlEzCreate@8"
  PerlEzCreateOpt(lpFileName.s, lpOptions.s, lpScriptOpts.s) As "_PerlEzCreateOpt@12"
  PerlEzDelete(hHandle.l) As "_PerlEzDelete@4"
  PerlEzEvalString(hHandle.l, lpString.s, lpBuffer.s, dwBufSize.l) As "_PerlEzEvalString@16"
  PerlEzCall1(hHandle.l, lpFunction.s, lpBuffer.s, dwBufSize.l, lpFormat.s, *lpVoid) As "_PerlEzCall1@24"
  PerlEzCall2(hHandle.l, lpFunction.s, lpBuffer.s, dwBufSize.l, lpFormat.s, *lpVoid, *lpVoid2) As "_PerlEzCall2@28"
  PerlEzCall4(hHandle.l, lpFunction.s, lpBuffer.s, dwBufSize.l, lpFormat.s, *lpVoid, *lpVoid2, *lpVoid3, *lpVoid4) As "_PerlEzCall4@36"
  PerlEzCall8(hHandle.l, lpFunction.s, lpBuffer.s, dwBufSize.l, lpFormat.s, *lpVoid, *lpVoid2, *lpVoid3, *lpVoid4, *lpVoid5, *lpVoid6, *lpVoid7, *lpVoid8) As "_PerlEzCall8@52"
  ;PerlEzCall() As "_PerlEzCall" ; diese Art der variablen Parameter wird nicht unterstützt in PB
  ;PerlEzCallContext() As "_PerlEzCallContext"; diese Art der variablen Parameter wird nicht unterstützt in PB
  PerlEzSetMagicScalarFunctions(hHandle.l, *lpfFetch, *lpfStore) As "_PerlEzSetMagicScalarFunctions@12"
  PerlEzSetMagicScalarName(hHandle.l, pVariableName.s) As "_PerlEzSetMagicScalarName@8"
EndImport
Hier die angepaßte "test.pb"

Code: Alles auswählen

XIncludeFile "PerlEz_Include.pbi"

plHandle.l = PerlEzCreate("test.pl")

buffer.s = Space(1024)

Debug PerlEzCall4(plHandle, "stringfield", buffer, 1024,  "sssi", @"hallo ich bin der text", @"2", @"ich", @dummy.l)
Debug buffer

PerlEzDelete(plHandle)
Nochmal die "test.pl"

Code: Alles auswählen

#!
sub stringfield { return 0 || (split(("$_[2]"||" "), $_[0]))[$_[1] - 1] if($_[1]); }
Hier der komplette Download, incl. der DLLs, der Headerdatei mit
Funktionsbeschreibung (ist sehr ausführlich), sowie den eben geposteten
Sourcen.

http://ts-soft.eu/dl/perlez.zip

@Nero
Wäre nett wenn Du noch ein paar Beispiele, bzw. auch wiederverwendbar
Funktionen posten könntest. Für einen Nicht-Perler ist das zu schwierig :wink:
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Hm Beispiele omg was den so?
Bin grad ratlos mir fällt nix sinvolles ein :lol:

Hm vieleich dieser schnipsel zum suchen und ersetzen mit RegExp

PB Code

Code: Alles auswählen

buffer.s = Space(1024)
testString.s = "<a hreff='http://www.purebasic.fr/german'>PB Forum</a>"
RegExp.s = "s/(.*?)>(.*?)<\/a>/$2/g"

PerlEzCall2(plHandle, "RegExp", buffer, 1024,  "ss", @testString, @RegExp)

Debug buffer
Perl Code

Code: Alles auswählen

sub RegExp { eval('$_[0] =~ '. $_[1]); return $_[0]; }

Naja ist nix tolles aber mir kommt gerade absolut nix in den sinn was fürn
sinnvolles Beispiel gut wäre *g*
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 »

Sieht doch gut aus, RegEx brauchen wir doch. Nur eine PB Procedure draus
machen, der man die Parameter übergibt, und das Ergebnis zurück.

Und die Perl-Scirpte in einem Script zusammenfassen, so das man nur eins
beilegen muß, das dann man es leicht nutzen kann.

// Nachtrag:
Muster :wink:

Code: Alles auswählen

XIncludeFile "PerlEz_Include.pbi"

Procedure.s RegExp(String.s, RegExp.s)
  Protected plHandle.l = PerlEzCreate("test.pl")
  Protected buffer.s = Space(1024)
  PerlEzCall2(plHandle, "RegExp", buffer, 1024,  "ss", @String, @RegExp)
  PerlEzDelete(plHandle)
  ProcedureReturn buffer
EndProcedure

Debug RegExp("<a hreff='http://www.purebasic.fr/german'>PB Forum</a>", "s/(.*?)>(.*?)<\/a>/$2/g")
Perl-Script hab ich ans andere angefügt!
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Code: Alles auswählen

Procedure.s RegExp(String.s, RegExp.s)
  Protected plHandle.l = PerlEzCreate("test.pl")
  Protected buffer.s = Space(1024)
  PerlEzCall2(plHandle, "RegExp", buffer, 1024,  "ss", @String, @RegExp)
  PerlEzDelete(plHandle)
  ProcedureReturn buffer
EndProcedure 
Bin damit nicht so ganz einverstanden :mrgreen:

Dabei wird ja das Perl Script bei jeder benutzung neu eingelesen und verarbeitet.
Finde es besser dann doch lieber das handle zu übergeben das ist eventuell etwas schneller.

Habe bei mir mal noch eine kleine Include angelegt.

PerlTools_Include.pbi

Code: Alles auswählen

Procedure.s plStringField(plHandle.l, String.s, Field.s, Seperator.s, BufferSize.l = 1024)
  buffer.s = Space(BufferSize)
  PerlEzCall4(plHandle, "StringField", buffer, BufferSize,  "sssi", @String, @Field, @Seperator, @dummy.l)
  ProcedureReturn buffer
EndProcedure

Procedure.s plRegEx(plHandle.l, String.s, RegEx.s, BufferSize.l = 1024)
  buffer.s = Space(BufferSize)
  PerlEzCall2(plHandle, "RegEx", buffer, BufferSize,  "ss", @String, @RegEx)
  ProcedureReturn buffer
EndProcedure
Das Main File sieht bei mir nun so aus

Code: Alles auswählen

XIncludeFile "PerlEz_Include.pbi"
XIncludeFile "PerlTools_Include.pbi"

plHandle.l = PerlEzCreate("tools.pl")

Debug plRegEx(plHandle, "<a hreff='http://www.purebasic.fr/german'>PB Forum</a>", "s/(.*?)>(.*?)<\/a>/$2/g")
Debug plStringField(plHandle, "hallo ich bin der text", "1", "")

PerlEzDelete(plHandle)
Die test.pl hab ich auch mal tools.pl genannt und hat folgenden inhalt

Code: Alles auswählen

#!
sub StringField { return 0 || (split(("$_[2]"||" "), $_[0]))[$_[1] - 1] if($_[1]); }
sub RegEx { eval('$_[0] =~ '. $_[1]); return $_[0]; }
Gut 2 Funktionen sind nicht die welt aber halt ein anfang :lol:
Es ist jeder herzlich eingeladen das ganze zu erweitern :mrgreen:
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 »

Nero hat geschrieben:Bin damit nicht so ganz einverstanden :mrgreen:
Okay, einverstanden
Nero hat geschrieben: Gut 2 Funktionen sind nicht die welt aber halt ein anfang :lol:
Es ist jeder herzlich eingeladen das ganze zu erweitern :mrgreen:
Das glaube ich, aber die Perl-Syntax werde ich bestimmt nicht lernen :mrgreen:
AND51 wird bestimmt drauf erpicht sein zu helfen, und evtl. gibts ja noch
mehr Perl-Progger, muß ja nicht heute schon eine riesen Funktionssammlung
werden. Aber unsere Strukture haben wird, der Wrapper scheint zu gehen,
bei dem Rest werde ich mal abwarten, was da noch kommt :wink:

// Nachtrag: Aber protected sollten die Variablen in den Proceduren schon sein,
sonst hauen wir nachher eine vorhandene globale buffer um den Haufen
: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
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 »

Folgende Änderungen:
Protected Vars in Proceduren
plStringField - Field als long definiert, ist logischer

"PerlTools_Include.pbi"

Code: Alles auswählen

XIncludeFile "PerlEz_Include.pbi"

Procedure.s plStringField(plHandle.l, String.s, Field.l, Seperator.s = "", BufferSize.l = 1024)
  Protected buffer.s = Space(BufferSize)
  Protected Result.l, sField.s = Str(Field)
  Result = PerlEzCall4(plHandle, "StringField", buffer, BufferSize,  "sssi", @String, @sField, @Seperator, @dummy.l)
  If Result = #plezNoError
    ProcedureReturn buffer
  Else
    Debug "Perl Error " + Str(Result)
  EndIf
EndProcedure

Procedure.s plRegEx(plHandle.l, String.s, RegEx.s, BufferSize.l = 1024)
  Protected Result.l, buffer.s = Space(BufferSize)
  Result = PerlEzCall2(plHandle, "RegEx", buffer, BufferSize,  "ss", @String, @RegEx)
  If Result = #plezNoError
    ProcedureReturn buffer
  Else
    Debug "Perl Error " + Str(Result)
  EndIf
EndProcedure

example.pb

Code: Alles auswählen

XIncludeFile "PerlEz_Include.pbi"
XIncludeFile "PerlTools_Include.pbi"

plHandle.l = PerlEzCreate("PerlTools.pl")

Debug plRegEx(plHandle, "<a hreff='http://www.purebasic.fr/german'>PB Forum</a>", "s/(.*?)>(.*?)<\/a>/$2/g")
Debug plStringField(plHandle, "hallo ich bin der text", 1)

PerlEzDelete(plHandle)
Ich hoffe mal, Du bist einverstanden?
Zuletzt geändert von ts-soft am 02.04.2007 00:02, insgesamt 1-mal geändert.
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Jup bin einverstanden habs auch gleich so übernommen :)
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 »

Nero hat geschrieben:Jup bin einverstanden habs auch gleich so übernommen :)
Dann nochmal, habs geändert :wink:
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
Antworten