Schrift
[thread]3001[/thread]

Text-Filter: Scriptproblem



<< >> 7 Einträge, 1 Seite
Taulmarill
 2006-01-26 14:36
#28382 #28382
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
tr/// ist nicht für das ersetzen von worten oder zeichenketten sondern für einzelne zeichen gedacht. benutze statt dessen s///

ausserdem würde ich dir dazu raten, anstatt des -w hinter dem perl die zeile use warnings; zu benutzen. du solltest auch use strict; benutzen. dann musst du nur noch alle variablen mit my deklarieren.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
näfr
 2006-01-26 16:29
#28383 #28383
User since
2006-01-26
3 Artikel
BenutzerIn
[default_avatar]
Danke für die raschen Antworten mit den weiterführenden Links!

Ich habe mich schlau zu machen und einige Ratschläge zu befolgen versucht und erhalte nun (an anderer Stelle des vollständigen Gästebuch-Scripts, also ausserhalb des zuvor beschrieben Kontextes bezüglich Wörter-Filter) eine hartnäckige Fehlermeldung.

Es erscheint die Meldung:
syntax error [at ...], near "$FORM{"
Execution of guestbook.pl aborted due to compilation errors.


Die Variabeln $name und $value werden allerdings bereits vor dem Aufruf mit "my" deklariert, trotzdem scheint 'my $name' bei Aufruf notwendig, im Gegensatz dazu gibt's zu '$value' keinen Fehler:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
# ...

use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);

#...

(my $name, my $value) = split(/=/, $pair);

# ...

my $FORM{my $name} = $value;


Wo immer das 'my' im letzten Ausdruck verwendet wird, erfolgen jetzt Fehlermeldungen, obschon ich die Variabeln ($FORM, $name, $value) mit 'my' deklariert habe und ich sonst bei ähnlichen Situationen auch nicht mit 'my' Aufrufen muss...

Da scheint was faul zu sein mit dem Geltungsbereich der Namen unter Verwendung von 'use strict;'. Leider komme ich nicht dahinter woran es liegt...
näfr
 2006-01-26 19:22
#28384 #28384
User since
2006-01-26
3 Artikel
BenutzerIn
[default_avatar]
Cool, vielen Dank, es läuft wieder und filtert nun auch, soweit korrekt, siehe  betreffendes Gästebuch!

Ich habe u.a. den Formular-Hash ausserhalb der foreach-Schleife lokalisiert:
Code: (dl )
1
2
3
4
5
6
7
8
my %FORM = ();
foreach my $pair (@pairs) {
  my ($name, $value) = split(/=/, $pair, 2);
  $FORM{$name} = $value;

  # ... es folgen diverse Kodierungen ...

}


Ich denke es wäre schon von Vorteil, u.a. zum Splitten der Formularfelder das CGI-Modul zu verwenden...

Die empfohlene Perl-Einführung werde ich mir als Anfänger gerne gelegentlich zu Gemüte führen. Ich bin jedoch sehr dankbar für die hilf- und lehrreiche Unterstützung und dass für diese Detailfragen (Ergänzung eines Wörterfilters) kein eingehenderes Perl-Studium notwendig war!

Grüsse
Roman
Gast Gast
 2006-01-26 14:20
#28385 #28385
Hallo Cracks
Wer weiss Rat? Ich komme da mit einem Anfängerproblem nicht weiter, eine ähnliche Anordnung (IP-Filter) funktioniert einwadfrei, doch ich kann den Fehler im unten kommentierten Wörterfilter nicht finden...

Wörter-Filter: Folgende Komponente eines Gästebuch-Scripts soll den Inhalt eines Formularfeldes auf ausgeschlossene Begriffe aus einem Array überprüfen (und den Eintrag bei Übereinstimmung sperren).

Das Problem liegt wahrscheinlich in diesem Ausdruck my $WZaehler = ($FORM{'comments'} =~ tr/$key_word//i);
...
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
#!/usr/bin/perl -w

# Perl-Script zur Filterung des Formularfeldes $FORM{'comments'} nach Begriffen (aus Array)

# Problem: Die Zeile:
#
# my $WZaehler = ($FORM{'comments'} =~ tr/$key_word//i);
#
# ... ergibt immer true, auch wenn keine Uebereinstimmungen im Feldwert vorhanden sind!

# Aufgabe:
# Suche nach Begriffen, welche 1x enthalten sind (Platzhalter: wort.*)
# 'au' soll gefunden werden in Haus, aus, miau, miAU, blauschwarz
# i = ignoring case

# filtering of not allowed words (1 = ON/ 0 = OFF)
$use_keyfilter = 0;
@key_filterlist = ('.20six.co.uk','.netfirms.com');

# init
$keyword_found = 0;
#
# Key word filter
if($use_keyfilter) {
foreach $key_word (@key_filterlist) {
#
my $WZaehler = ($FORM{'comments'} =~ tr/$key_word//i);
#
if( $WZaehler > 0) {
$keyword_found = 1;
}
}
}

&no_permission unless !$keyword_found;

sub no_permission  {
print "No permission to write this content!\n";
}
Relais
 2006-01-26 14:52
#28386 #28386
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Anstelle
Code: (dl )
1
2
3
4
5
        my $WZaehler = ($FORM{'comments'} =~ tr/$key_word//i);
#
if( $WZaehler > 0) {
$keyword_found = 1;
}


probiere mal

Code: (dl )
1
2
3
        if ( $FORM{'comments'} =~ m/$key_word/i ) {
$keyword_found = 1;
}


Weiter Wiki:perldoc perlintro und perldoc perlrequick, perldoc perlre, perldoc perlretut lesen...
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Strat
 2006-01-26 17:54
#28387 #28387
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
m/$key_word/i 

kann probleme bereiten, wenn in $key_word irgendwelche regex-sonderzeichen vorkommen, z.B.
Code: (dl )
$key_word = "(abc";

ergibt einen fehler. deshalb $key_word immer quoten
Code: (dl )
m/\Q$key_word\E/

Code: (dl )
my ($name, $value) = split(/=/, $pair);

kann problematisch sein, weil z.B. bei abc=def=3da das 3da einfach verschuett geht. ein wenig sicherer ist:
Code: (dl )
my ($name, $value) = split(/=/, $pair, 2); # teile nur in 2 teile auf

dann waere $value = "def=3da" und man kann zumindest ueberpruefen, ob in $value ein = vorkommt (falls das = kein gueltiges zeichen von $value ist)
Code: (dl )
my $FORM{my $name} = $value;

hat mehrere probleme:
1. my $FORM{$name} geht nicht; wenn du einen hash deklarieren willst:
Code: (dl )
1
2
3
4
my %FORM;
$FORM{schluessel} = 'wert',
# oder
my %FORM = (schluessel => 'wert');

du kannst nicht einen teil eines hashes mit my deklarieren (das wuerde nur eventuell mit local funktionieren, aber das willst du nicht)

2.
Code: (dl )
$FORM{my $name} = $value;

my $name hat noch keinen wert, weil es eben erst deklariert wurde. es ist also gleichbedeutend mit
Code: (dl )
$FORM{undef} = $value;

undef ist zwar ein gueltiger Wert fuer einen hashschluessel, aber den willst du wohl nicht haben. my deklariert eine voellig neue variable; du willst jedoch das schon vorhandene $name haben, also kein my, sondern eher sowas wie:
Code: (dl )
1
2
3
my %FORM = ();
my ($name, $value) = split(/=/, $pair, 2);
$FORM{$name} = $value;


ich glaube, meine "Einfuehrung in Perl" von meiner HP unter Vortraege wuerde dir nicht schaden...\n\n

<!--EDIT|Strat|1138290931-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
näfr
 2006-01-26 20:17
#28388 #28388
User since
2006-01-26
3 Artikel
BenutzerIn
[default_avatar]
- Zu früh gefreut! -

Jetzt wird die MIME-Decodierung nicht mehr richtig ausgegeben, irgendwo stimmt die Lokalisierung von Variabeln doch noch nicht so ganz...

- doch dies nicht mehr heute, meinerseits! - ...
<< >> 7 Einträge, 1 Seite



View all threads created 2006-01-26 14:36.