Leser: 16
h2xs -n cstruct
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "const-c.inc"
/* Your C-Code goes here: */
typedef struct __CStruct {
char *name;
int num;
} CStruct;
void setName(CStruct *s, char *n) {
if (s != NULL) {
if (s->name != NULL) {
free(s->name);
}
s->name = (n != NULL) ? strdup(n) : NULL;
}
}
/* End of C-Code */
MODULE = cstruct PACKAGE = cstruct
# XS-Code:
CStruct *createStruct(name, num)
char* name
int num
CODE:
CStruct *s = (CStruct*) malloc(sizeof(CStruct));
s->name = NULL;
setName(s, name);
s->num = num;
RETVAL = s;
OUTPUT:
RETVAL
void
deleteStruct(s)
CStruct* s
CODE:
if (s != NULL) {
if (s->name != NULL) {
free(s->name);
}
free(s);
}
void
setName(s, name)
CStruct* s
char* name
char*
getName(s)
CStruct* s
CODE:
if (s != NULL) {
RETVAL = s->name;
} else {
RETVAL = "";
}
OUTPUT:
RETVAL
# End of XS-Code
INCLUDE: const-xs.inc
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
use warnings;
use strict;
use cstruct;
my $exmp = cstruct::createStruct("abc", 999);
print cstruct::getName($exmp) . "\n";
cstruct::deleteStruct($exmp);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "const-c.inc"
void printHallowelt() {
printf("Hallo Welt!\n");
}
MODULE = hallowelt PACKAGE = hallowelt
void
printHallowelt()
INCLUDE: const-xs.inc
2020-01-09T08:21:46 rostiWieso heise? Die Dokumentation ist erstklasssig, da steht alles drin. MFG
MyCModule::myCFunction();
2020-01-10T07:51:07 rostiInline C wäre auch eine Möglichkeit
2020-01-10T07:51:07 rostiPerl XS: Mit dem Dienstprogramm h2xs ezeugst Du alle Dateien die für ein zünftiges und portierbares CPAN-Modul erforderlich sind und natürlich auch die XS-Datei.
2020-01-10T07:51:07 rostiViel Erfolg!
1 2 3 4 5 6 7 8 9 10
#!/bin/bash PERLCOREPATH="/usr/lib/perl5/5.18.1/i586-linux-thread-multi/CORE" MODULENAME="hello" swig -perl5 "$MODULENAME".i gcc -fpic -c -Dbool=char -I"$PERLCOREPATH" "$MODULENAME"_wrap.c "$MODULENAME".c -D_GNU_SOURCE gcc -shared "$MODULENAME".o "$MODULENAME"_wrap.o -o "$MODULENAME".so
1 2 3 4 5 6 7
#!/usr/bin/perl use strict; use warnings; use hello; hello::printHello();
1 2 3 4 5 6 7 8
#include <stdio.h> void inithello() { } void printHello() { printf("Hello World!\n"); }
1 2 3 4 5 6 7 8 9 10
#!/bin/bash PYTHONINCLUDEPATH="/usr/include/python" MODULENAME="hello" swig -python "$MODULENAME".i gcc -fpic -c -Dbool=char -I"$PYTHONINCLUDEPATH" "$MODULENAME"_wrap.c "$MODULENAME".c -D_GNU_SOURCE gcc -shared "$MODULENAME".o "$MODULENAME"_wrap.o -o _"$MODULENAME".so
2020-01-12T09:26:48 rostiPerl und Python -- Wird ja auch Zeit daß Du damit mal was machst ;)
Leider ist es nicht möglich, PHP in Perl einzubetten. MFG
2020-01-13T11:58:59 rostiAchso. Ich dachte Du schreibst mal ein Modul für Perl in Python. Was mit dem Inlinemodul möglich wäre. MFG
2020-01-14T07:18:52 rostiNatürlich bringt das was, also es ist ein Unterschied ob Code kompiliert vorliegt und gleich ausgeführt werden kann oder ob erst kompiliert werden muss. Das ist ja Sinn und Zweckbestimmung von XS.
2020-01-14T08:52:47 hlubenowDa bin ich anderer Meinung. Perl (und auch Python) verwenden dynamische Datentypen wie Listen und Hashes und verwalten deren Speicher automatisch. Dadurch ist es angenehm zu programmieren, aber es kostet Zeit in der Programmausführung.
C dagegen ist relativ unangenehm zu programmieren, dafür sind C-Programme schnell.
2020-01-14T10:06:12 RaubtierLeider hat sich für mich herausgestellt: Perl ist tot. Außer mir hassen es alle meine Kollegen (auch wenn sie nie damit gearbeitet haben). Und Python hat einfach die besseren Module - zumindest für meine Einsatzbereiche. Oder gibt es sowas wie Pandas, Dash, Flask, Matplotlib, ... für Perl?