Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5633[/thread]

RegEx: großes, umfangreiches Problem (Seite 2)

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Crian
 2003-08-18 11:51
#65088 #65088
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Und es könnte sein, dass Du Deinen Stil ändern willst ;)
perldoc perlstyle
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pktm
 2003-08-18 13:43
#65089 #65089
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Beispiel für FAQ-Seiten (noch event. mit ein oder anderem Fehler, muss die vorher unbedingt noch prüfen lassen)
Code: (dl )
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<html>
<head>
<link href="seiten/css/c_ie.css" type="text/css" rel="stylesheet">
</head>
<body>

<h1>Arrays</h1>
<li>Wie kann man Listen erzeugen?
<li>Array löschen / leeren
<li>Array in String umwandeln
<li>Doppelte Einträge in Array t&ouml;ten
<li>Wie kann man Teile einer Liste kopieren?
<li>Wie kann man zwei Listen miteinander vergleichen?
<li>Wie kann man eine oder mehrere Liste in eine Subroutine übergeben?
<li>letztes Element ausgeben
<li>Schleife über alle Indizies


<hr />

<H2 align=left>Wie kann man Listen erzeugen?</H2>
<P align=left>Hier einige Beispiele zum expliziten Anlegen von Listen:</P>
<DIV align=left><PRE align="left">my @list;
my @list2 = (); # leere Liste
my @list3 = ('item1', 'item2', $item3);
my @list4 = qw(item1 item2 item3 item4);
</PRE>
<P align=left>Falls man die Liste nicht deklarieren will und wenn man
nicht mit use strict arbeitet, kann man Listen auch implizit anlegen:</P><PRE align="left">$list5[4] = 'item4';
@list6[4,5] = (1,2);
</PRE>
<P align=left>Hier werden automatisch Listen angelegt, deren Elemente 0
bis 3 nicht definiert sind (=undef), also praktisch zu Beginn eine Lücke
haben.</P>

<hr />

<h2>Array löschen / leeren</h2>
<pre>
@array = ();
</pre>

<hr />

<h2>Array in String umwandeln</h2>
<pre>
$subs{mainContent}= join"",substitute(@whatToPrint)

oder:
{ local $"; $subs{mainContent} = "@{[substitute (@whatToPrint)]}";}
</pre>

<hr />

<h2>Doppelte Einträge in Array t&ouml;ten</h2>
<pre>
%hash=();
for(@array){$hash{$_}=1}
@array=keys(%hash);

<hr id="hr" />

Indexnummer beim durchlaufen eines Arrays mit foreach feststellen:
a)
foreach my $zeile ( @array ) { # ... Kein Zugriff auf Zeilenzahlen...
$zeilenzahl++; # jetzt aber doch....
b)
foreach my $index ( 0..$#array ) { # jetzt Zeilenzahlen...
$array[$index] # Zugriff auf den aktuellen Slot....
</pre>

<hr />

<H2><BR>Wie kann man Teile einer Liste kopieren?</H2>

<PRE> my @newList = @list[4..20, 30];
my ($firstElement, @restOfList) = @list;
my (@bigList) = (@smallList1, @smallList2);
my @reverseList = reverse (@list);
</PRE>

<hr />

<H2>Wie kann man zwei Listen miteinander vergleichen?</H2>

<P>Wenn es sich um Listen handelt, die nicht allzuviele Elemente
enthalten, funktioniert folgender Ansatz recht gut:</P>

<PRE>if ("@list1" eq "@list2){
print ("same\n");
}
else {
print ("not the same\n");
}
</PRE>

<P>Die Listen werden zu einem String verarbeitet, wobei die einzelnen
Elemente mit einem Leerzeichen zusammengefügt werden. Und diese beiden
Strings werden dann verglichen.</P>
<P>Wenn man größere Listen vergleichen will, könnte man folgende
Möglichkeit wählen:</P>

<PRE>
my $difference = "";

if ($#list1 eq $#list2){ # vergleiche Anzahl an Elementen
for my $i (0.. $#list1){
if ($list1[$i] ne $list2[$i]){ # vergleiche einzelne Elemente
$difference = "nicht";
last; # ueberspringe die restlichen Elemente
}
}
}
else {
$difference = "nicht";
}
print ("Listen sind $difference identisch\n");
</PRE>

<hr />

<H2>Wie kann man eine oder mehrere Liste in eine Subroutine übergeben?</H2>
<P>Indem man eine Listenreferenz darauf bildet, und die dann übergibt.</P>
<PRE>
my @liste = (1,2,3,4,5,6,7,8);
my $listenReferenz = \@liste; # Referenz bilden
&amp;PrintListe($listenReferenz);

sub PrintListe {
my ($localListenReferenz) = @_;
my @localeListe = @$localListenReferenz; # dereferenzieren

foreach (@localeListe){
print $_, "\t";
}

print "\nOder direkt die Listenreferenz verarbeiten:\n";
foreach (@$localListenReferenz){ # dereferenzierung hier
print $_, "\t";
}

print "\nOder direkt über Listenreferenz-Indices verarbeiten:\n";
foreach my $i (0..$#$localListenReferenz){
print $localListenReferenz-&gt;[$i], "\t";
}

} # PrintListe
</PRE>

<P>Und nun mit mehreren Listen:</P><PRE>my @liste1 = (1,2,3,4,5,6,7,8);
my @liste2 = (9,10,11,12);
my $listenReferenz1 = \@liste1; # Referenz bilden
&amp;PrintListen($listenReferenz1, \@liste2);

sub PrintListen {
my ($localListenReferenz1, $localListenReferenz2) = @_;
my @localeListe = @$localListenReferenz; # dereferenzieren

foreach (@localeListe, @$localListenReferenz){
print $_, "\t";
}

} # PrintListe
</PRE>

<hr />

<h2>letztes Element ausgeben</h2>

<pre>
my @zahlen = 1 .. 10;
print "die letzte zahl ist die $zahlen[-1]\n";

#Ausgabe:
#die letzte zahl ist die 10
</pre>

<hr />

<h2>Schleife über alle Indizies</h2>

<pre>
for my $cnt ( 0 .. $#array ) { ...
</pre>

<hr />

<p align="right">
<form action="http://127.0.0.1/cgi-bin/redaktionsystem/admin_edit.cgi">
<input type="hidden" name="file" value="d:/down/faq/arrays.html" />
<input type="submit" value="Admin" />
</form>
</p>

</body>
</html>

Anderes Beispiel:
Code: (dl )
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
<html>
<head>
<link href="seiten/css/c_ie.css" type="text/css" rel="stylesheet">
</head>
<body>

<h1>Cookies</h1>

<li><a href="#intro">Was sind Cookies?</a>
<li><a href="#kekse_perl">Cookies mit perl</a>
<li><a href="#kekse_setzen">Cookies setzen (perl-script)</a>
<li><a href="#cookies_ohne_modul">Cookies ohne CGI.pm</a>

<hr />

<a name="intro">& </a>
<h2>Was sind cookies?</h2>

<p>Cookies sind kleine Textdateien, die auf Ihrem Computer gespeichert werden. Sie können prinzipiell keinen ausführbaren Code enthalten, sind damit also garantiert Viren-frei.</p>

<p>Diese Textdateien werden entweder durch JavaScripts oder durch CGI-Anwendungen erzeugt. In ihnen können verschiedenste Informationen gespeichert werden, z.B. wer Sie sind (gut zu sehen bei Amazon.de) oder mit welchem Passwort Sie sich identifizieren (gutes Beispiel: die UBB-Boardsysteme). Letztendlich bestimmt der Programmierer des JavaScripts bzw. der CGI-Anwendung, was das Cookie enthält.</p>

<p>Würden die Informationen einfach nur in der Cookie-Datei gespeichert, wären sie sinnlos. Der Programmierer hat daher die Möglichkeit, in den Cookies gespeicherte Informationen wieder abzurufen. Damit Daten-Spione nicht alle Ihre Cookies auslesen können, werden Cookies nur an den Server gesendet, von dem sie gekommen sind. </p>

</p>Insgesamt kann man sagen, dass Cookies keinen direkten Schaden anrichten können. Denken Sie daran, es werden nur kleine Textdateien hin- und hergeschoben. Bedenklich ist jedoch, dass Cookies theoretisch für das Verfolgen von Usern über verschiedene Websites hinweg genutzt werden könnten.</p>

<p>Richtig eingesetzt sind Cookies keine Belästigung, sondern eine enorme Hilfe für z.B. Besucher einer personalisierbaren Seite.</p>

<p>Leider gibt es bei vielen Surfern immer noch Vorbehalte gegenüber Cookies, was zu einem großen Teil an falschen, im Netz kursierenden Informationen über Cookies liegt. Daher ist es sinnvoll, die Anwender vor der Verwendung von Cookies genau darüber aufzuklären, was sie erwartet. </p>

<p>
Autor: Alexander Dilthey<br />
Quelle:
<a href="http://www.aboutwebdesign.de/awd/content/978831056.shtml" target="2">
http://www.aboutwebdesign.de/awd/content/978831056.shtml</a><br />
Erstmalig veröffentlicht: 07.01.2001
</p>

<hr />

<a name="kekse_perl">& </a>
<h2>Cookies mit perl</h2>

<h3>Einleitung</h3>

<p>Cookies sind immer dann gefragt, wenn es darum geht, eine Information auf dem Browser Ihres Benutzers zu speichern (für nähere Informationen zu Cookies siehe <a href="#intro">Was sind Cookies?)</a>.</p>

<p>Gerade Script-Programmierer, die personalisierbare Anwendungen erstellen, machen Gebrauch von der Cookie-Technologie. Praktisches Beispiel: Sie wollen eine Anwendung erstellen, die es dem Benutzer erlaubt, sich das Design Ihrer Seiten selbst zusammenzustellen. Beim nächsten Besuch soll exakt die gleiche Design-Zusammenstellung angezeigt werden. Dafür müssen Sie auf dem Computer des Benutzers speichern, welches Design er sich ausgesucht hat - ein Fall für Cookies.</p>

<p>Glücklicherweise unterstützt das CGI-Modul den Umgang mit Cookies:</p>

<h3>Speicherung</h3>
<pre>
use CGI qw(:standard);

my $cookie = cookie (
-NAME => 'lay',
-VALUE => $lay,
-EXPIRES => '+10y',
-DOMAIN => '.aboutwebdesign.de'
);
</pre>

<p>Die Bedeutung Optionen <code>-NAME</code> und <code>-VALUE</code> sollte sich von selbst erschließen. Der bei -NAME angegebene Wert wird übrigens hinterher benötigt, um den bei -VALUE angegebenen String wieder auszulesen.</p>

<p><code>-EXPIRES</code> legt fest, wie lange das Cookie gültig, also abrufbar, bleiben soll. Folgende Werte sind hier erlaubt:</p>

<pre>
+30s - 30 Sekunden
+10m - 10 Minuten
+1h - 1 Stunde
-1d - überhaupt nicht
now - überhaupt nicht
+3M - 3 Monate
+10y - 10 Jahre
Thursday, 27-Apr-2000 01:30:22 GMT - Beliebig festlegbar
</pre>

<p>Wobei letztere Angabe natürlich nur ein Beispiel ist..</p>

<p>Mit der Option -DOMAIN kann festgelegt werden, welche Server das Cookie abrufen dürfen. Wird diese Option weggelassen, kann nur der Server, der das Cookie gesetzt hat, das Cookie abrufen. Entscheidet man sich für den Einsatz dieser Option, muss man auf jeden Fall zwei Punkte einsetzen (überlicherweise einen vor dem Domainnamen und einen vor der Top-Level-Domain).</p>

<p>Vorläufiges Fazit: ein Cookie-Objekt ist in der $cookie-Variable gespeichert. Um das Cookie letztendlich an den Benutzer zu senden, verwenden Sie diesen Code:</p>

<pre>
print redirect(
-URL => "http://www.xyz.de/success.html",
-COOKIE => $cookie
);
</pre>

<p>Wichtig ist, dass Sie vorher keinen HTML-Header gesendet haben. Daher ist es auch unmöglich, gleichzeitig ein Cookie und eine normale HTML-Seite zu senden. Was jedoch möglich ist: erst das Cookie zu senden und dann den Benutzer auf eine normale HTML-Seite weiterzuleiten, wo ihn dann eine z.B. eine Bestätigungs-Meldung erwartet. Dazu dient der Parameter -URL.</p>

<h3>Abruf</h3>

<p>Der Abruf eines Cookies gestaltet sich wesentlich unkomplizierter:</p>

<pre>
use CGI qw(:standard);
my $wert = cookie("identifier");
</pre>

<p>Der Identifier muss dem Wert entsprechen, der beim Speichern dem -NAME-Parameter zugewiesen wurde.</p>

<p>Autor: Alexander Dilthey<br />
Quelle: <a href="http://www.aboutwebdesign.de/awd/content/978832689.shtml" target="2">
http://www.aboutwebdesign.de/awd/content/978832689.shtml</a><br />
Erstmalig veröffentlicht: 07.01.2001
</p>

<hr />


<a name="kekse_setzen">& </a>
<h2>Cookies setzen (perl-script)</h2>

<pre>

#!/usr/bin/perl -wT
use strict;
$|++;
use CGI qw/:standard /;
use CGI::Cookie;

# war der user schon mal da, dann hat er ein Cookie, das sein Browser übersandte
my $sessionId= cookie('sessionID')? cookie('sessionID'):'none';

my $hiddenInfo = new CGI::Cookie(
-name=>'sessionID',
-value=>$sessionId,
-expires=>'+3M',
-domain=>'deine.domain.de'
);


.
.
print redirect(
-uri=>$uri,
-cookie=>[$hiddenInfo]
);


oder

print header(
-charset=>'iso-8859-1'),
-cookie=>[$hiddenInfo]
);
</pre>

<p>Ist eben immer die Frage ob man CGI.pm lieber objektorientiert oder funktional nutzt.
Übrigens die Dokumentation zu CGI/Cookie.pm ist lesenswert. Da sind auch Beispiele drin.</p>


<hr />

<a name="cookies_ohne_modul">& </a>
<h2>Cookies ohne CGI.pm</h2>


<H3>Cookies einlesen</H3>
<P align=justify>Das einlesen von Cookies ohne CGI Modul ist
eigentlich ganz einfach. <B>ALLE</B> vom Browser gesendeten
Cookies werden genauso wie Formulardaten als ein langer String
übergeben. Dieser findet sich in der Umgebungsvariable
<B>$ENV{'HTTP_COOKIE'}</B>. Der Unterschied zu Formulardaten
besteht darin, das die Name/Wert Paare nicht mit einem
Kaufmannsund (<B>&amp;</B>) sondern mit Semikola (<B>;</B>)
getrennt sind. Die folgende Subroutine liest alle übergebenen
Cookies in das globale Hash %COOKIES ein. </P><PRE><B>my</B> <FONT color=#2040a0>%COOKIES</FONT>;

<B>sub<FONT color=#ff0000> get_cookies</FONT> {</B>
<B>my</B> <FONT color=#2040a0>@raw_cookies</FONT>;
<B>my</B> <FONT color=#4444ff><B>(</B></FONT><FONT color=#2040a0>$name</FONT>, <FONT color=#2040a0>$value</FONT><FONT color=#4444ff><B>)</B></FONT>;

<FONT color=#909090># Rohcookies trennen
</FONT><FONT color=#2040a0>@raw_cookies</FONT> = <FONT color=#a52a2a><B>split</B></FONT> <FONT color=#4444ff><B>(</B></FONT><FONT color=#b000d0>/; /</FONT>,<FONT color=#2040a0>$ENV</FONT><FONT color=#4444ff><B>{</B></FONT><FONT color=#55aa55>'HTTP_COOKIE'</FONT><FONT color=#4444ff><B>}</B></FONT><FONT color=#4444ff><B>)</B></FONT>;

<FONT color=#909090># Name / Wert Paare trennen
</FONT><B>foreach</B> <FONT color=#4444ff><B>(</B></FONT><FONT color=#2040a0>@raw_cookies</FONT><FONT color=#4444ff><B>)</B></FONT> <FONT color=#4444ff><B>{</B></FONT>
<FONT color=#4444ff><B>(</B></FONT><FONT color=#2040a0>$name</FONT>, <FONT color=#2040a0>$value</FONT><FONT color=#4444ff><B>)</B></FONT> = <FONT color=#a52a2a><B>split</B></FONT> <FONT color=#4444ff><B>(</B></FONT><FONT color=#b000d0>/=/</FONT>,<FONT color=#2040a0>$_</FONT><FONT color=#4444ff><B>)</B></FONT>;
<FONT color=#2040a0>$COOKIES</FONT><FONT color=#4444ff><B>{</B></FONT><FONT color=#2040a0>$name</FONT><FONT color=#4444ff><B>}</B></FONT> = <FONT color=#2040a0>$value</FONT>;
<FONT color=#4444ff><B>}</B></FONT>
<FONT color=#4444ff><B>}</B></FONT>
</PRE><A name=set>&nbsp;</A>




<H3>Cookies setzen</H3>
<P align=justify>Zu setzende Cookies werden im HTTP Header an
den Browser gesendet. Dazu werden der Subroutine sechs Werte
übergeben:
<UL>
<LI>Der Name des Cookies
<LI>Der Wert der gespeichert werden soll
<LI>Das Verfallsdatum des Cookies als GMT Timestring in
folgendem Format: 'Mon, 01-Jan-1996 00:00:00 GMT'. Wird kein
Wert angegeben gilt das Cookie bis zum Ende der Session
(normalerweise bis der Browser geschlossen wird)
<LI>Der Domainname für den das Cookie gültig ist. Dabei gilt
die Regel, das der Server der das Cookie setzen will zur
entsprechenden Domain gehöhren muss. Es ist also nicht
möglich das 'www.meinserver.com' ein Cookie für
'www.andererserver.com' setzt. <B>WICHTIG:</B> Der
Domainname muss mindestens zwei Punkte enthalten
(<B>.meinserver.com</B>). Dadurch wird es möglich ein Cookie
für alle Subdomains eines Servers zu setzen. Wird Kein Name
angegeben gilt das Cookie nur für den aktuellen Server
dieser Domain.
<LI>Der Pfad auf dem Server an den das Cookie gesendet
werden soll (typischerweise <B>'/'</B> oder
<B>'/cgi-bin'</B>). Wird kein Name angegeben gilt das Cookie
nur für den Pfad in dem das angeforderte Dokument liegt.
<LI>Flag ob das Cookie verschlüsselt gesendet werden soll (0
= normal, 1 = secure) </LI></UL>
<P></P><PRE><FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>"Content-type: text/html<FONT color=#5555bb>\n</FONT>"</FONT>;
&amp;set_cookie<FONT color=#4444ff><B>(</B></FONT><FONT color=#55aa55>'Cookiename'</FONT>, <FONT color=#55aa55>'Cookiewert'</FONT>,
<FONT color=#55aa55>'G&amp;uuml;ltiger Pfad'</FONT>, <FONT color=#55aa55>'Domainname'</FONT>,
<FONT color=#55aa55>'GMT Verfallsdatum'</FONT>, <FONT color=#800080><B>0</B></FONT><FONT color=#4444ff><B>)</B></FONT>;
<FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>"<FONT color=#5555bb>\n</FONT>"</FONT>;

<B>sub<FONT color=#ff0000> set_cookie</FONT> {</B>
<FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>"Set-Cookie: <FONT color=#2040a0>$_</FONT>[0]=<FONT color=#2040a0>$_</FONT>[1];"</FONT>;
<B>if</B> <FONT color=#4444ff><B>(</B></FONT><FONT color=#2040a0>$_</FONT><FONT color=#4444ff><B>[</B></FONT><FONT color=#800080><B>2</B></FONT><FONT color=#4444ff><B>]</B></FONT><FONT color=#4444ff><B>)</B></FONT> <FONT color=#4444ff><B>{</B></FONT><FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>" path=<FONT color=#2040a0>$_</FONT>[2];"</FONT>;<FONT color=#4444ff><B>}</B></FONT>
<B>if</B> <FONT color=#4444ff><B>(</B></FONT><FONT color=#2040a0>$_</FONT><FONT color=#4444ff><B>[</B></FONT><FONT color=#800080><B>4</B></FONT><FONT color=#4444ff><B>]</B></FONT><FONT color=#4444ff><B>)</B></FONT> <FONT color=#4444ff><B>{</B></FONT><FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>" expires=<FONT color=#2040a0>$_</FONT>[4];"</FONT>;<FONT color=#4444ff><B>}</B></FONT>
<B>if</B> <FONT color=#4444ff><B>(</B></FONT><FONT color=#2040a0>$_</FONT><FONT color=#4444ff><B>[</B></FONT><FONT color=#800080><B>3</B></FONT><FONT color=#4444ff><B>]</B></FONT><FONT color=#4444ff><B>)</B></FONT> <FONT color=#4444ff><B>{</B></FONT><FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>" domain=<FONT color=#2040a0>$_</FONT>[3];"</FONT>;<FONT color=#4444ff><B>}</B></FONT>
<B>if</B> <FONT color=#4444ff><B>(</B></FONT><FONT color=#2040a0>$_</FONT><FONT color=#4444ff><B>[</B></FONT><FONT color=#800080><B>5</B></FONT><FONT color=#4444ff><B>]</B></FONT> == <FONT color=#800080><B>1</B></FONT><FONT color=#4444ff><B>)</B></FONT> <FONT color=#4444ff><B>{</B></FONT><FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>" secure"</FONT>;<FONT color=#4444ff><B>}</B></FONT>
<FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>"<FONT color=#5555bb>\n</FONT>"</FONT>;
<FONT color=#4444ff><B>}</B></FONT>
</PRE><A name=del>&nbsp;</A>




<H3>Cookies löschen</H3>
<p>Um ein Cookie zu löschen wird das
entsprechende Cookie einfach 'überschrieben' und als
Verfallsdatum ein Datum in der Vergangenheit angegeben. Daher
braucht nur der Cookiename übergeben werden. </P>

<PRE>
<FONT color=#a52a2a><B>print</B></FONT>
<FONT color=#55aa55>"Content-type: text/html<FONT color=#5555bb>\n</FONT>"</FONT>;
&amp;delete_cookie<FONT color=#4444ff><B>(</B></FONT>
<FONT color=#55aa55>'Cookiename'</FONT><FONT color=#4444ff><B>)</B></FONT>;
<FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>"
<FONT color=#5555bb>\n</FONT>"</FONT>;

<B>sub<FONT color=#ff0000> delete_cookie</FONT> {</B>
<FONT color=#a52a2a><B>print</B></FONT> <FONT color=#55aa55>"Set-Cookie:
<FONT color=#2040a0>$_</FONT>[0]=NULL; expires=Mon, 01-Jan-1996 00:00:00 GMT
<FONT color=#5555bb>\n</FONT>"</FONT>;
<FONT color=#4444ff><B>}</B></FONT>


<p>Autor: HeXaChLoR<br />
Veröffentlicht: 09.02.2000<br />
Quelle: http://perlhelp.de/codecookie.xml/index (existiert nicht mehr)</p>

<hr />

<p align="right">
<form action="http://127.0.0.1/cgi-bin/redaktionsystem/admin_edit.cgi">
<input type="hidden" name="file" value="d:/down/faq/cookie.html" />
<input type="submit" value="Admin" />
</form>
</p>

</body>
</html>

Ahja, @crian, die Diskussion hatten wir aufm alten Board auch schon.
Der Stil ist doch ok, ich verwende nur nicht so viele Einzeiler, sondern lasse es im Block-Format (nennt man das so?)
Oder was meinst du mit Stil ändern? Was würdest du anders machen? Sag es mir aber bitte über Mail, PM oder in einem anderen Thread, ich muss mit dem Prob. hier fertig werden...
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
kabel
 2003-08-18 14:53
#65090 #65090
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
R E A D M O R E P L E A S E :)

hier ist die grammatik. have fun.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $grammar = q~
titel: '<h1>' /.*(?=<\/h1>)/ '</h1>' { $return = $item[2]; }
toc_eintrag: '<li>' /[^\n]*/ { $return = $item[2] || ""; chomp $return; }
toc: toc_eintrag(s?)
header: titel toc { $return = {TITEL => $item[1], TOC => $item[2]}; }
link: /<a[ \w="\d]*?>/i /(.|\s)*?(?=<\/a>)/i /<\/a>/i { $return = $item[2]; }
start_h2: /<H2>/i
end_h2: /<\/H2>/i
eintrag_separator: /<hr \/>/i
eintrag: eintrag_separator link(?) start_h2 /.*(?=<\/H2>)/i end_h2 /(.|\s)*?(?=<hr \/>)/ {
$return = { EINTRAG_TITEL => $item[4], EINTRAG_TEXT => $item[6] || "", LINK => $item[2] || ""};
chomp $return->{EINTRAG_TEXT};
}
eintraege: eintrag(s?) eintrag_separator { $return = $item[1]; }
datei: header eintraege { $return = [$item[1], $item[2]]; }
~;

falls jemand ne erklärung will => frage!

sie kann die zwei beispiele parsen (ohne das vor- bzw. nachgeplänkel, also vom <h1>-tag bis zum letzten <hr />).
die aufgebaute struktur sieht bei der eingabe
Quote
<h1>Cookies</h1>

<li><a href="#intro">Was sind Cookies?</a>
<li><a href="#kekse_perl">Cookies mit perl</a>
<li><a href="#kekse_setzen">Cookies setzen (perl-script)</a>
<li><a href="#cookies_ohne_modul">Cookies ohne CGI.pm</a>

<hr />
<a name="intro">& </a>
<h2>Was sind cookies?</h2>
<p>Cookies sind kleine Textdateien, die auf Ihrem Computer gespeichert werden.
<hr />
<a name="kekse_perl">& </a>
<h2>Cookies mit perl</h2>
<h3>Einleitung</h3>
<hr />
<a name="kekse_setzen">& </a>
<h2>Cookies setzen (perl-script)</h2>
<pre> blubber di bla
<hr />
<a name="cookies_ohne_modul">& </a>
<h2>Cookies ohne CGI.pm</h2>
<H3>Cookies einlesen</H3>
<hr />

so aus:
Code: (dl )
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
kabel@linux:~/progs/perl/pktm> perl -w pktm.pl
$VAR1 = [
{
'TOC' => [
'<a href="#intro">Was sind Cookies?</a>',
'<a href="#kekse_perl">Cookies mit perl</a>',
'<a href="#kekse_setzen">Cookies setzen (perl-script)</a>',
'<a href="#cookies_ohne_modul">Cookies ohne CGI.pm</a>'
],
'TITEL' => 'Cookies'
},
[
{
'EINTRAG_TITEL' => 'Was sind cookies?',
'LINK' => [
'& '
],
'EINTRAG_TEXT' => '<p>Cookies sind kleine Textdateien, die auf Ihrem Computer gespeichert werden.'
},
{
'EINTRAG_TITEL' => 'Cookies mit perl',
'LINK' => [
'& '
],
'EINTRAG_TEXT' => '<h3>Einleitung</h3>'
},
{
'EINTRAG_TITEL' => 'Cookies setzen (perl-script)',
'LINK' => [
'& '
],
'EINTRAG_TEXT' => '<pre> blubber di bla'
},
{
'EINTRAG_TITEL' => 'Cookies ohne CGI.pm',
'LINK' => [
'& '
],
'EINTRAG_TEXT' => '<H3>Cookies einlesen</H3>'
}
]
];
kabel@linux:~/progs/perl/pktm>


HTH :unclesam:
-- stefan
SirLant
 2003-08-18 15:42
#65091 #65091
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Ich will ne Erklärung :)
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
kabel
 2003-08-19 00:19
#65092 #65092
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
fast vergessen ;) das ist hier natürlich informell, wahrscheinlich sind teile sogar falsch, aber zum verstehen tut das hoffentlich.

eine grammatik ist eine möglichkeit, einen text zu beschreiben. der text muss dazu eine struktur besitzen, die allen zu analysierenden texten unterliegt. in diesem falle sind die texte in pktm's tollem html-format. genau dieses wird mit der grammatik beschrieben.

aus den von pktm geposteten einträgen kann auf die struktur geschlossen werden:

titel toc <hr /> <h2>überschrift 1</h2> inhalt <hr /> <hr /> <h2>überschrift 2</h2> inhalt <hr />

aus dieser struktur heraus ist die grammatik entstanden.

wie lese ich eine grammatik?
datei: header eintraege
eine datei besteht aus einem header und den einträgen
header: titel toc
der header besteht aus dem titel und dem toc
titel: '<h1>' /.*(?=<\/h1>)/ '</h1>'
der titel besteht aus einem string '<h1>', gefolgt von beliebigem text (in dem nicht </h1> vorkommen darf, stichwort zero-width positive look-ahead), und dann der string '</h1>'
toc: toc_eintrag(s?)
der toc besteht aus keinem, einem oder mehreren toc_einträgen (für die genauen codes in den pod gucken).
toc_eintrag: '<li>' /[^\n]*/
ein toc-eintrag besteht aus dem string '<li>', und dann beliebigen zeichen bis auf das newline zeichen.

und so gehts einfach weiter. der code hinter den sog. produktionen wird ausgeführt, falls diese erfolgreich angewendet werden konnte. in diesem fall baut die grammatik eine datenstruktur auf, die unbedingt auf eine antwort von pktm wartet :p

zum nachdenken: du kennst bereits einen grammatik-typ und wendest ihn fast blind an! :) hehe das oben beschriebene ist lediglich eine stufe mächtiger.
-- stefan
SirLant
 2003-08-19 01:39
#65093 #65093
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Ok, denke ich habe das im großen und ganzen verstanden :)
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
pktm
 2003-08-19 03:03
#65094 #65094
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=kabel,18.08.2003, 22:19][/quote]
Quote
in diesem fall baut die grammatik eine datenstruktur auf, die unbedingt auf eine antwort von pktm wartet :p

Hab mir die Sache mal angeguckt und versucht in meinem Buch etwas darüber zu finden - erfolglos. Aber da hast du ja jetzt Abhilfe geschaffen :)


Quote
zum nachdenken: du kennst bereits einen grammatik-typ und wendest ihn fast blind an! :) hehe das oben beschriebene ist lediglich eine stufe mächtiger.


Du meinst XML::Pharser ?
http://www.intergastro-service.de (mein erstes CMS :) )
SirLant
 2003-08-19 03:05
#65095 #65095
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Ne ich denke er meint die Grammatik um unserer normalen , menschlichen Sprache
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
kabel
 2003-08-19 12:23
#65096 #65096
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
nein, beide falsch :) ich lasse euch aber diesmal nicht zappeln. hehe :p
reguläre ausdrücke sind eine "schwächere" form von grammatiken. wenn du z.b. sagst:

Quote
$stupid_form_input =~ m/^[ab]{1,3}$/ or die ...


dann ist /^[ab]{1,3}$/ die beschreibung einer einfachen sprache - sie enthält genau folgende elemente:
{ "a", "b", "aa", "ab", "ba", "ab", "aaa", "aab", "aba", "ab", "baa", "bab", "bba", "bbb" }
das wird bei sogar bei einfachen regulären ausdrücken schnell recht komplex. der reguläre ausdruck kann in einer grammatik dargestellt werden:

start: a_oder_b a_oder_b? a_oder_b?
a_oder_b: "a" | "b"

(genauso lesen wie oben beschrieben) probiert es doch einfach mal aus. flux das modul Parse::RecDescent installieren und folgendes programm ausführen:

Code: (dl )
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
use strict;
use Parse::RecDescent;

my $grammar = '
start: a_oder_b a_oder_b(?) a_oder_b(?) eos
a_oder_b: "a" | "b"
eos: "?"
';
my $parser = Parse::RecDescent->new ($grammar);
my $re = qr/^[ab]{1,3}$/;

my $input = "";
my $switch = "regexp";
my $res = 0;

print "exit beendet, switch schaltet um\n\n";
while ($input ne "exit") {
printf "%-7s: gib irgendwas ein: ", $switch;
chomp ($input = <STDIN>);

if ($input eq "switch") {
$switch eq "regexp" and $switch = "grammar" or $switch = "regexp";
next;
} elsif ($input eq "exit") {
next;
} elsif ($switch eq "regexp") {
$res = "$input" =~ $re ? 1 : 0;
} else {
$res = $parser->start ("$input?") ? 1 : 0;
}

print "[$switch] [$input] wird", $res ? "" : " nicht", " erkannt\n";
}

warum das fragezeichen beim parser-aufruf? aufgrund der arbeitsweise des parsers. damit kennzeichne ich das ende des wortes.

genauso könnte oben beschriebene grammatik als regulärer ausdruck dienen (das überlasse ich dem geneigten leser ;) ), denn das format von pktm enthält keine "rekursive struktur" (oh je, mir wird schlecht...). => für $grammar oben kann genauso eine menge gebaut werden, und diese umfasst u.a. auch die von pktm geposteten beispiele (got it?)

am besten mal ne vorlesung über formale sprachen an der nächsten $uni besuchen :)

SirLant, natürliche sprachen sind die kompliziertesten sprachen überhaupt. die oben beschriebenen sprachen sind von der struktur gesehen sehr einfach. bei natürlichen sprachen gibt es so was wie nebensätze mit all ihren spielarten, numerus und kasus, modus etc. etc. etc.

so jetzt ist aber wirklich schluss. genug unsinn verzapft. :)
-- stefan
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2003-08-17 18:54.