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 »

AND51 hat geschrieben: 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).
Hier mal etwas schneller, aber bestimmt noch zu optimieren :mrgreen:

Code: Alles auswählen

Procedure splitStringToArray(Array.s(1), String.s, Separator.s = " ")
  Protected *s.Character = @String, Count.l, nString.s, n.l, nSeparator.l = Asc(Separator)
  If String <> ""
    While *s\c <> 0
      If *s\c = nSeparator
        Count + 1
      EndIf
      *s + SizeOf(Character)
    Wend
    *s = @String
    ReDim Array.s(Count)
    For n = 0 To Count
      While *s\c <> nSeparator And *s\c <> 0
        nString + Chr(*s\c)
        *s + SizeOf(Character)
      Wend
      Array.s(n) = nString
      nString = ""
      *s + SizeOf(Character)
    Next
    ProcedureReturn Count + 1
  EndIf
EndProcedure

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

For n=0 To anzahl-1
  Debug woerter(n)
Next
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 »

Frage: DU kennst doch sicherlich || und or. Warum kann ich das hier nicht schreiben:
Bei Variablen must du immer || nehmen.
http://perldoc.perl.org/perlop.html#Log ... 2c-and-and
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Kiffi hat geschrieben:
edel hat geschrieben:schonmal an pcre oder sogar an Boost gedacht ?
na klar, hast Du etwa unsere romantischen Skype-Abendunterhaltungen vergessen (u.a. auch mit Delphi)? ;-)
Jetzt wo du es sagst ...

ts kommt auch immer mit Funktionen an die ich geschrieben haben soll ... , ich werd halt alt :lol:
Kiffi hat geschrieben: <träum>
Wäre halt schön mit Perl oder PHP oder Schiess-Mich-Tot ein AllInOne-Paket
zu bekommen, mit dem man RegExp, XML, SQLite, etc. pp, erschlagen
könnte.
</träum>
Das meiste davon hast du ja schon gemacht. Noch etwas vereinfachen,
zusammen packen und schon ist dein "AllInOne-Paket" fertig ;-)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Hier mal etwas schneller
Wollte auch erst mit Pointer arbeiten, aber ich kann heut nicht klar denken... Sollte mich erst auskurieren...

Hinweis: StringField akzeptiert blöderweise nur 1 Zeichen als Separator, Perl-split() ermöglicht aber mehrere Zeichen, weshalb ich erst an Pointer dachte.
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 ne möglichkeit

Code: Alles auswählen

Procedure split(Array.s(1), String.s, Separator.s = " ")  
  Laenge.l = Len(String)

  count.l = 0
  For x = 0 To Laenge  
    If PeekS(@String + x, 1) = Separator
      count + 1
      ReDim Array.s(count)
    Else
      Array.s(count) + PeekS(@String + x, 1)
    EndIf     
  Next
EndProcedure

Dim NewArray.s(0)
split(NewArray(), "So nun sollte es korreckt funktionieren") 

For x = 0 To PeekL(@NewArray() - 8) - 1 
  Debug NewArray(x)
Next
Zuletzt geändert von Nero am 30.03.2007 19:01, insgesamt 3-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Pearl ist doch die Tochter von Mr.Crabs.... was wollt ihr den alle von der?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

AND51 hat geschrieben: Hinweis: StringField akzeptiert blöderweise nur 1 Zeichen als Separator, Perl-split() ermöglicht aber mehrere Zeichen, weshalb ich erst an Pointer dachte.
Entweder man schreibt was neues oder benutzt das was da ist.

Beispiel :

Code: Alles auswählen

  ImportC "msvcrt.lib"
    CompilerIf #PB_Compiler_Unicode
    strtok(*string,*seps) As "_wcstok"
    CompilerElse
    strtok(*string,*seps) As "_strtok" 
    CompilerEndIf 
  EndImport
  
  Define Token.l
  Define String.s
  Define Seps.s
  
  String = "Die ist ein TestString, mit viel Unsinn !"
  Seps   = " ," ; Leerzeichen , Komma
  
  Token = strtok(@String,@Seps)
  
  While Token
    
    Debug PeekS(Token)
    
    Token = strtok(#Null,@Seps)
  Wend
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Kaeru Gaman hat geschrieben:Pearl ist doch die Tochter von Mr.Crabs.... was wollt ihr den alle von der?
Kannst du solche Spaßbeiträge mal bitte lassen? Was solln das jetzt wieder? Außerdem reden wir nicht von Pearl, sondern Perl. War echt witzig :twisted:


> Entweder man schreibt was neues oder benutzt das was da ist.
In diesem Fall warte ich dann doch lieber, bis Fred endlich mal nen vernünftigen StringField einbaut /:->

Hast aber Recht. Frage: Wie funktioniert deine Version? Soll die auch mehrere Zeichen unterstützen?
Wenn ja: Warum trennt deine Funktion anscheinen nur gemäß eines Leerzeichens?
Wenn nein: Wo bleibt das Komma?
Oder ist das eine Funktion, die mehere Trennzeichen in einem Vorgang unterstützt
Debugger hat geschrieben:Die
ist
ein
TestString
mit
viel
Unsinn
!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Es sind 2 (zwei) Trennzeichen, warum sollte also das Komma angezeigt werden ?

Mehr kannst du auf MSDN nachlesen.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

OK, also dein Trennzeichen lautet also " ," aber wieso trennt er dann auch noch dortr, wo nur ein Leerzeichen ist?

Würde StringField() mit mehreren Zeichen arbeiten, käme beim Debugger folgendes raus.
Die ist ein TestString
mit viel Unsinn !
Das würd ich jetzt auch von deinem Code erwarten.

Ich les mal die MSDN.

//Edit:
Da siehste was ich meine, deine Funktion arbeitet nciht, wie erwartet:

Code: Alles auswählen

  ImportC "msvcrt.lib" 
    CompilerIf #PB_Compiler_Unicode 
    strtok(*string,*seps) As "_wcstok" 
    CompilerElse 
    strtok(*string,*seps) As "_strtok" 
    CompilerEndIf 
  EndImport 
  
  Define Token.l 
  Define String.s 
  Define Seps.s 
  
  String = "DieAistBeinABTestStringAmitAvielAUnsinnB!" 
  Seps   = "AB" ; Leerzeichen , Komma 
  
  Token = strtok(@String,@Seps) 
  
  While Token 
    
    Debug PeekS(Token) 
    
    Token = strtok(#Null,@Seps) 
  Wend
Deiner Beschreibung nach sollte er nur bei "ein" trennen, tut er aber nicht.
MSDN hat geschrieben:strDelimit
Set of delimiter characters.
Also unterstützt deine Funktion indirekt auch wieder nur 1 Zeichen.
Zuletzt geändert von AND51 am 30.03.2007 21:10, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten