PurePerl »»» Implementierung von Perl in PB

Fragen zu allen anderen Programmiersprachen.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

k habs übernommen <)

Werde morgen mal schauen und mir mal gedanken über ein paar nützliche
funktionen machen damit es nicht nur 2 bleiben ^^
// Nachtrag: Aber protected sollten die Variablen in den Proceduren schon sein,
sonst hauen wir nachher eine vorhandene globale buffer um den Haufen
Stimmt
Das sind dann die sachen wo man sucht und sucht und den fehler nicht findet :lol:
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: Werde morgen mal schauen und mir mal gedanken über ein paar nützliche
funktionen machen damit es nicht nur 2 bleiben ^^
Vorher bitte meine letzte Version laden:
http://ts-soft.eu/dl/perlez.zip

Gruß
Thomas
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 »

Habs geupdatet.

Hm macht mal vorschläge ich steh aufm schlauch :lol:
irgentwie will mir nix sinvolles einfallen /:->
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:Hm macht mal vorschläge ich steh aufm schlauch :lol:
irgentwie will mir nix sinvolles einfallen /:->
splitStringToArray wie AND51 bereits vorgeschlagen hatte
Und HashTables! Wenns geht.
Split(), Join() usw., alles was in PB fehlt oder eingeschränkt ist.
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 »

So, bin wieder da, mich hat's am WE so richtig erwischt... *schnief*

Mal sehen, was ihr bis jetzt fabriziert habt!
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 »

So, bin wieder da, mich hat's am WE so richtig erwischt... *schnief*
Wilkommen zurück und gute besserung :mrgreen:

So hab mal ne kleine SplitToArray Procedure erstellt

neu in der example.pb

Code: Alles auswählen

  Dim String.s(0)
  plStringToArray(String(), plHandle, "hallo ich bin der text", " ")
  Debug String(2)
neu in der PerlTools_Include.pbi

Code: Alles auswählen

Procedure plStringToArray(MyArray.s(1), plHandle.l, String.s, Seperator.s = " ", BufferSize.l = 1024)
  Protected buffer.s = Space(BufferSize)
  Protected Key.s = MD5Fingerprint(@String, Len(String))  
  Result = PerlEzCall4(plHandle, "SplitToArray", buffer, BufferSize,  "sssi", @Key, @String, @Seperator, @dummy)
  If Result = #plezNoError    
    ReDim MyArray.s(Val(buffer) - 1)
    For x.l = 0 To Val(buffer) - 1
    sX.s = Str(x)
      Protected ARBuffer.s = Space(BufferSize) 
      Result = PerlEzCall2(plHandle, "getSplitElement", ARBuffer, BufferSize,  "ss", @Key, @sX)
      If Result = #plezNoError
        MyArray(x) = ARBuffer        
      Else
        plDebugErrorString(Result)
      EndIf
    Next
    ProcedureReturn 1
  Else
    plDebugErrorString(Result)
  EndIf
EndProcedure
und die PerlTools.pl sieht nun so aus

Code: Alles auswählen

#!
my %ArrayList;

sub StringField { return 0 || (split(("$_[2]"||" "), $_[0]))[$_[1] - 1] if($_[1]); }
sub RegEx { eval('$_[0] =~ '. $_[1]); return $_[0]; }

sub SplitToArray
{
  if (!$ArrayList{$_[0]})
  {
    my @Array = split(("$_[2]"||" "), $_[1]);
       $ArrayList{$_[0]} = \@Array; 
       return @{$ArrayList{$_[0]}};   
  }
  else
  {
       return @{$ArrayList{$_[0]}};
  }
}
sub getSplitElement { return $ArrayList{$_[0]}[$_[1]]; }
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Hm Hashes kannst du eigentlich auch verwenden

Code: Alles auswählen

  buffer.s = Space(BufferSize)
  PerlEzEvalString(plHandle, "%NeyHash = ('key1' => '123', 'key2' => '456')", buffer, 1024);  
  PerlEzEvalString(plHandle, "$NeyHash{'test'} = 'ich bin ein hash Test ';", buffer, 1024);  
  PerlEzEvalString(plHandle, "return $NeyHash{'test'};", buffer, 1024);
  Debug buffer
  PerlEzEvalString(plHandle, "return $NeyHash{'key2'};", buffer, 1024);
  Debug buffer  
  PerlEzEvalString(plHandle, "return $NeyHash{'key1'};", buffer, 1024);
  Debug buffer
Sieht zwar nicht schön aus würde aber funktionieren
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Habe das nochmal in einer Procedure zusammengefast

Die PerlTools_Include.pbi damit erweitern

Code: Alles auswählen

Procedure.s plEval(plHandle.l, evalString.s, ReturnBuffer.l = 1, BufferSize.l = 1024)
  Protected buffer.s = Space(BufferSize)
  Result = PerlEzEvalString(plHandle, evalString, buffer, BufferSize);
  If Result = #plezNoError    
    If ReturnBuffer = 1
      ProcedureReturn buffer  
    EndIf
  Else
    plDebugErrorString(Result)
  EndIf   
EndProcedure
example.pb

Code: Alles auswählen

  plEval(plHandle, "%NeyHash = ('key1' => '123', 'key2' => '456')", 0)
  plEval(plHandle, "$NeyHash{'test'} = 'ich bin ein hash Test';", 0) 
  
  Debug plEval(plHandle, "$NeyHash{'test'};")  
  Debug plEval(plHandle, "$NeyHash{'key2'};") 
  Debug plEval(plHandle, "$NeyHash{'key1'};")
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Tipp: EIne PB'ische Version des splitStringToArray() habe ich einige Seiten zuvor gebastelt, ist kürzer, als deine.

Noch ein Tipp: Als ich splitStringToArray() vorschlug, habe ich das getan, als Vergleich:
- in PB gibt's das nicht (selber coden)
- in Perl gibt's sogar einen nativen Befehl dafür

Der Perl Befehl heißt ganz einfach split() und gibt ein Array zurück. Warum also ein eigenes split() nacprogrammieren? :wink:
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 »

Noch ein Tipp: Als ich splitStringToArray() vorschlug, habe ich das getan, als Vergleich:
- in PB gibt's das nicht (selber coden)
- in Perl gibt's sogar einen nativen Befehl dafür

Hm also die SplitToArray nutzt ja den Perl Split() ^^
Das es dircket in PB kürzer geht is klar sollen ja nur Beispiele sein was man so machen kann.

So und nun noch nen Bsp. mit splice()

neu in der PerlTools_Include.pbi

Code: Alles auswählen

Procedure plSplice(plHandle.l, MyArray.s(1), splStart.l, splStop.l, String.s = "")
  Protected buffer.s = Space(BufferSize)

  plEval(plHandle, "my @WorkArray ;", 0)
    
  For x = 0 To PeekL(@MyArray.s() - 8) - 1
    plEval(plHandle, "$WorkArray["+Str(x)+"] = '" + MyArray.s(x) + "';", 0)  
  Next
  
  If String <> ""
    plEval(plHandle, "splice(@WorkArray,"+Str(splStart)+","+Str(splStop)+","+String+");", 0) 
  Else
    plEval(plHandle, "splice(@WorkArray,"+Str(splStart)+","+Str(splStop)+");", 0) 
  EndIf
  
  Rows.l = Val(plEval(plHandle, "@WorkArray;"))  
  ReDim MyArray.s(Rows)
  
  For x = 0 To Rows
    MyArray.s(x) = plEval(plHandle, "@WorkArray["+Str(x)+"];")
  Next  
EndProcedure

und in der example.pl

Code: Alles auswählen

  For x = 0 To PeekL(@String() - 8) - 1
    Debug String(x)
  Next  
  Debug Space(1)  
  plSplice(plHandle, String(), 1, 0, "Neu1")
  plSplice(plHandle, String(), 4, 0, "Neu2")
  plSplice(plHandle, String(), 5, 1, "der_ist_ersetzt")  
  For x = 0 To PeekL(@String() - 8) - 1
    Debug String(x)
  Next
Antworten