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: Perl:

Code: Alles auswählen

my %Personen=("Hinz" => "Norden"
              "Kunz" => "Süden");

print $Personen{"Hinz"} # Debuggen von Hinz' Wohnort
print $Personen{"Kunz"} # Und wo wohnt Kunz?
Wie kommt man denn von %Personen auf $Personen, sind doch zwei völlig
unterschiedliche Variablen, oder ist das wieder ein Typo?
Und wieso sind Hinz und Kunz grösser gleich?
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 »

Ich wills dir gern erklären:

Nein, es ist kein Schreibfehler, das ist PureAbsicht :lol:
  • $Personen ist ein Skalar (Variable)
  • @Personen ist ein Array, auf das aber mit $Personen[0], $Personen[1], ..., $Personen[-1] zugegriffen werden kann.
    Möchte man auf ein Feld des Arrays zugreifen, dann notiert man ein $-Zeichen davor und in [Klammern] den Index dahinter. Habe ich schon erwähnt, dass man in Perl auch mit negativen Indexzahlen auf das Array zugreifen kann? Dann beginnt die Zählung von hinten, -1 ist also das letzte Element, -2 das vorletzte, etc. Das ist wieder so ein Kniff, der es Perl'ern einfach macht, das sollte man in PB auch einführen. Es ermöglich nämlich, auf ein Array zuzugreifen, dessen Länge man nicht kennt (obwohl es kinderleichtist, die Länge zu ermitteln).
  • %Personen ist das assoziative Array (siehe den zitierten Code), auch hier wird ein $-Zeichen notiert, wenn man später darauf zugreifen will. Hinter dem Hashnamen (Hash = assoziatives Array) wird in {Klammern} der Index, der in diesem Fall ja ein String ist, notiert.
Merke: Lediglich beim deklarieren von Variablen, Arrays und Hashes wird das spezielle Vorzeichen ($ @ %) benötigt, beim späteren Arbeiten nicht.

> Und wieso sind Hinz und Kunz grösser gleich?
Dies ist nur wieder eine von meheren möglichen Schreibweisen. Um den Hash zu füllen, kann ich auch mit Kommas arbeiten:

Code: Alles auswählen

my %personen=("Hinz", "Norden"
              "Kunz", "Süden");
Der Hashpfeil dient lediglich zur besseren übersicht, man kann schneller erkennen, was => wem zugeordnet ist. Bei Zahlen und Strings, die nur aus einem Wort bestehen, dürfen dabei die "Anführungszeichen" entfallen:

Code: Alles auswählen

my %alter=(Hinz => 43     # Hier dürfen Anführungszeich. weggelass. werd., da es nur ein Wort bzw. eine Zahl ist
          "Kunz Schmidt" => 34);   # Hier muss der Name m. Anführungszeich. notiert werden (weg. Leerzeichen)
Nebenbei bemerkt sieht man, dass man auch mehrzeilig arbeiten kann, wie auch in Delphi und PHP (mehrzeiligkeit wird momentan in PB nicht unterstützt).
Das hier die Anführungszeichen entfallen können ist wieder so eine Sache der Leserlichkeit. Wenn du sagst: "Das ist unleserlich", dann arbeitest du eben konsequent mt Anführungszeichen. Dies ist wieder so eine Sache, bei der es dem Programmierer überlassen ist, ob er schludert oder konsequent leserlich schreibt. Man kann die Schuld nicht Perl in die Schuhe schieben.



Merke außerdem: Wie in PB dürfen Arrays, Variablen und Hashes gleichen Namens vorkommen, jede "Gattung" hat ihren eigenen Namensraum, so wie in PureBasic eben.
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 »

AND51 hat geschrieben: Merke außerdem: Wie in PB dürfen Arrays, Variablen und Hashes gleichen Namens vorkommen, jede "Gattung" hat ihren eigenen Namensraum, so wie in PureBasic eben.
Das kann ja nicht sein, wenn Du %Personen als assoziatives Arry definierst,
es aber hinterher mit der Syntax eines Scalars "$Personen" drauf zugreifst.

Perl mag ja gut mit Strings umgehen können, aber da es ein Interpreter ist,
ist auch die umständlichste PB-Routine, die dieses emuliert, schneller :mrgreen:
Assoziative Arrays will Fred ja seid 2003 implementieren, also warten wir
einfach mal ab :mrgreen:

RegEx währe auch noch nützlich, den Rest können wir uns glaub ich
schenken, da dies ja auch oft über externe Libs realisiert 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 »

> Das kann ja nicht sein, wenn Du %Personen als assoziatives Arry definierst,
> es aber hinterher mit der Syntax eines Scalars "$Personen" drauf zugreifst.
Vielleicht erklär ich's ja falsch, ich hoffe nicht.

Beispiel:

Code: Alles auswählen

my $sprache="Deutsch";

my @sprachen=("Perl", "PureBasic", "PHP")

my %einstufen=("Perl" => "mach ich gern",
               "PureBasic" => "mach ich am liebsten",
               "PowerBasic" => "kenne ich nicht");

print $sprachen; # ergibt Deutsch

print $sprachen[2]; # ergibt PHP (null-basierte Indizierung!)

print $sprachen{"PowerBasic"}; # ergibt kenne ich nicht
Sobald der Interpreter hinter dem Namen [ZAHL] oder {WORT} oder nix findet, weiß er, um was es sich handelt, Zahl wäre Array, Wort wäre Hash, nix wär eben der einfache Skalar (Variable).

Das $-Zeichen ist dabei immer Bestandteil der/des Variable/Arrays/Hashs, wenn man Werte auslesen oder speichern will. Die Zeichen $ @ % spielen nur bei der Deklaration eine Rolle.


Aus meinem Perl-Buch:
Perl Buch hat geschrieben:$emails - weist auf den Inhalt einre Variablen mit Namen "emails" hin
@emails - weist auf den Inhalt eines Arrays mit Namen "emails" hin [@emails einer Variablen zugewiesen gibt dann die Länge des Arrays zurück]
$emails[index] - weist auf den Wert mit dem Index "index" des Arrays "emails" hin
%emails - weist auf den Inhalt des Hashes mit Namen "emails" hin
$emails{key} - weist auf den Wert mit dem Schlüssel "key" des Hashes "emails" hin
Ich hoffe, ich konnte es dir verständlicher machen.



In PB ist es Vergleichbar:

Code: Alles auswählen

Define Alter  ; Define entspricht dem $ bei der Deklaration
Dim Alter.l(10)   ; Dim entspricht dem @ bei der Deklaration
NewList Alter.l() ; NewList könnte am ehesten mit % verglichen werden

; zugreifen tust doch jedoch auf alle drei Teile immer mit dem selben Präfix "" (nichts), in Perl lautet der Präfix eben "$" (Dollar)
; Das heißt: PureBasic erkennt anhand der "Anhängsel" (Zahl, Klammer, nix)
; ob es sich um eine Variable, Array oder Liste handelt:

Alter=42 ; Variable
Alter(4)=51 ; (4) deutet auf Array hin
AddElement(Alter())
Alter()=72 ; () weist auf eine LinkedList hin
> Fred ja seid 2003 implementieren
Wann das wohl sein wird? /:->

> externe Libs
Darüber gabs im engl. Forum eine Diskussion, warum es beispielsweise CountArrayElements() nativ geben sollte, oder warum man es sich selber coden soll.
Gegner: Muss man sich halt selber coden
Befürworter: Gewissheit, dass der Befehl auf in der nächsten Version gleich funzt / anfängerfreundlicher / es gibt keine Fehlerrisiken, wenn Fred es proggt (eigene Versionen können fehelrhaft sein)
Ich gehlre zu den Befürwortern.
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 »

Code: Alles auswählen

my %Personen=("Hinz" => "Norden");
my $Personen="AND51";

print $Personen{"Hinz"} # ergibt Norden ?
print $Personen # ergibt AND51 ?
Ist das jetzt so richtig?
Personen wird nach der Declaraton also an dem nach der Variable
unterschieden? Ansonsten hab ich recht und Du erzählst Mumpitz :wink:

Kann ich statt my auch your nehmen, oder was soll das?
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 »

Ist das jetzt so richtig?
Jup das ist so richtig
Kann ich statt my auch your nehmen, oder was soll das?
my ist wie das Protectet in PB

Perl ist cool man kann alles irgentwie immer kürzer schreiben :lol: :allright:

Code: Alles auswählen

sub stringfield { return 0 || (split(("$_[2]"|" "), $_[0]))[$_[1] - 1] if($_[1]); }
sub examinedirectory
{
   my @dateien, $i;
   opendir(DIR, $_[0]) or die "$!";
      while($datei = readdir(DIR)) {$dateien[$i++] = $datei if($datei ne '.' && $datei ne '..')};
   closedir(DIR);
   return @dateien;
}
Perl ist schon ganz Geil und gibt für so ziemlich jede denkbare aktion irgend nen modul was einem die Arbeit erheblich erleichtern kann.
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 »

>> sub stringfield { return 0 || (split(("$_[2]"|" "), $_[0]))[$_[1] - 1] if($_[1]); }
Das meinte ich mit unleserlichen Code :mrgreen:
Und es wird tatsächlich sehr viel so genutzt, nicht wie AND51 sagt, das es nur
die Möglichkeit gibt. Solcher Code ist absolut unleserlich. Eine Sprache, wo
die Wahrscheinlichkeit groß ist, das ich zwar meine Scripte lesen kann, aber
die von anderen nicht mehr, finde ich unmöglich.

Dagegen ist ja C fast wie dt. Sprache :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 »

> Kann ich statt my auch your nehmen, oder was soll das?
LOL, nein, aber es gibt noch "our", das entspricht dem "Global" in PB.

@ Nero
Hallo! Wie ich sehe bist du ein ein Perl-Fan. Deine StringField-Funtion sieht ja sehr kryptisch aus, das muss ich zugeben.
Wenn ihr Neros mit meinem StringField vergleicht, dann scheine ich noch nicht so viel drauf zu haben, wie Nero, das muss ich zugeben. Aber das liegt daran, dass ich mich in Perl erst wieder rein arbeiten muss, weil ich eine Jahrelange Perl-Pause hatte.

@ TS-Soft: Kannst du bitte mal unsere Diskussion abspalten (z. B. in die Laberecke), damit dieser Thread wieder frei wird für "richtige Beiträge"?
Dein Code ist schon richtig und auch die Erklärung dazu. Ich sehe in dir ein großes Perl-Talent schlummern :wink:
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 »

AND51 hat geschrieben: @ TS-Soft: Kannst du bitte mal unsere Diskussion abspalten (z. B. in die Laberecke), damit dieser Thread wieder frei wird für "richtige Beiträge"?
Dein Code ist schon richtig und auch die Erklärung dazu. Ich sehe in dir ein großes Perl-Talent schlummern :wink:
Es sind alles richtige Beiträge! Verstehe nicht was Du meinst.

Um Perl in PB zu integrieren gibts doch die Möglichkeit des embeded Perl.
Die DLL ist in Bin, die statische Lib in CORE, benötigte Header (embeded.h
Hauptsächlich) sind auch bei.

Warum schreibst Du nicht einfach den Wrapper für PB, da Du die Sprache
kennst, abgesehen davon das es fast 1500 Funktionen sind, sollte es kein Hit
sein Perl in PB einzubetten.
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 sind alles richtige Beiträge! Verstehe nicht was Du meinst.
Ich meinte Beiträge bezüglich des Threadtitels, wo am besten hier Leute rein schreiben sollten, die auch gern FUnktionen von PB nach Perl bringen möchten.

Ich weiß nicht, was du mit der Sache mit dem "embedded Perl" meinst; ich wollte lediglich einige interessante und nützliche PB Funktionen nach Perl portieren. Und mit der DLL Bin, CORE und embeded.h und so'n kram kenne ich mich nicht aus, ich weiß leider nicht, was du meinst.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten