Marcus Vieß: Filterproblem bei Perl

Das script soll bei bestimmten Wörtern die es findet bestimmte sachen machen. Mhh bis zu einem Teil funktioniert das ganze.
z.B. scheinen die ersten 3 Filterwörter tatsächlich zu klappern, nur das Ebay Wort scheint nicht zu laufen.

Liegt das daran das das Wort ebay in der $env eingebunden ist ?
also z.B. http://www.ebay.de/cgi-bin/blablabla.html während die anderen immer an ende hängen oder hab ich da grundsätzlich was falsch ?

Er sollte das Wort als Filter quasi mit Wildcard vorne und hinten nehmen, also quasi *.*ebay*.* oder *ebay*.

Kann mir einer helfen was fehlt oder falsch gemacht wird ?

Scriptauszug :

my(@filter) = ('robots.txt','favicon.ico','undefined','ebay');
my($filter) = join('|',@filter);

if(!($ENV{'REFERER_URL'} =~ /($filter)/) && !($ENV{'HTTP_REFERER'} =~ /($filter)/)) {

aktion1

} else { exit;}

gruß,
        Marcus

  1. Hi,

    z.B. scheinen die ersten 3 Filterwörter tatsächlich zu klappern, nur das Ebay Wort scheint nicht zu laufen.

    Du hast Dir natürlich die Werte, die Du da auf Deine Suchwörter hin überprüfst, mal ausgeben lassen. Wie lauten sie?

    Liegt das daran das das Wort ebay in der $env eingebunden ist ?

    Welches $env? Erstens ist es ein Hash, also %env, zweitens heißt es %ENV. Groß- und Kleinschreibung ist im Universum von entscheidender Bedeutung.

    my(@filter)

    Warum forcierst Du hier den Listenkontext? Die Klammern sind nicht nötig. In der nächsten Zeile noch weniger, Du hast nicht mal eine Liste.

    = ('robots.txt','favicon.ico','undefined','ebay');

    Danke für die Singlequotes!

    my($filter) = join('|',@filter);

    Es ist nicht wirklich sinnvoll, mehrere gleichnamige Variablen im selben Scope zu halten. Wenn Du $filter verwenden möchtest, nenne das Array z.B. @filterliste.

    if(!($ENV{'REFERER_URL'} =~ /($filter)/) && !($ENV{'HTTP_REFERER'} =~ /($filter)/)) {

    Dir ist bewusst, dass

    • "!(a =~ b)" identisch ist zu "a !~ b",
    • der Referer absolut kein Pflichtfeld ist und daher leer oder mit (für Dich) sinnfreien Werten gefüllt sein kann,
    • die Klammern innerhalb der Regular Expression zumindest bisher nicht nötig sind (vielleicht werden sie es später, das weiß ich nicht), und
    • Du hier case-sensitive abfragst, also wieder einmal "Ebay" != "ebay" ist?

    Zu den Details in Regular Expressions siehe

    perldoc perlre

    Cheatah

    1. Sowas hatte ich befürchtet.

      Jungs erstmal Danke für die Unterstützung.
      Aber, ich bin Perlnewbie und hacke mich gerade so langsam rein.

      Das ist alles etwas zu Fachchinesisch im moment.

      Mit "es läuft nicht" meine ich das ich trotz Filter 'ebay'

      die Url
      http://cgi.ebay.com/aw-cgi/eBayISAPI.dll?ViewItem&item=1030275113.
      nicht gefiltert wird.

      als auslesevariable soll $ENV{'REFERER_URL' & $ENV{'HTTP_REFERER'
      abgefragt werden.

      if(!($ENV{'REFERER_URL'} =~ /($filter)/) && !($ENV{'HTTP_REFERER'} =~ /($filter)/)) {

      sollte meines erachtens so funktionieren das eben beide Vars mit dem Filter überprüft werden.

      gruß,
              Marcus

      PS: Hash und Array, der unterschied ist mir noch nicht ganz klar. Aber wie gesagt, ich lerne.

  2. Hoi,   <-- sowas nennt man eine Begruessung

    z.B. scheinen die ersten 3 Filterwörter tatsächlich zu klappern, nur das Ebay Wort scheint
    nicht zu laufen.

    Was heisst 'nicht laufen'?

    Er sollte das Wort als Filter quasi mit Wildcard vorne und hinten nehmen, also quasi
    *.*ebay*.* oder *ebay*.

    Du meinst /ebay/?

    my(@filter) = ('robots.txt','favicon.ico','undefined','ebay');

    my @filter = ('robots\.txt','favicon\.ico','undefined','ebay');

    my($filter) = join('|',@filter);

    my $filter = join '|', @filter;

    Wo genau liegt dein Problem? Was laeuft nicht?

    Schau dir mal den Unterschied zwischen ($var) = und $var = an.

    Gruesse,
     CK

    1. Hallo

      my(@filter) = ('robots.txt','favicon.ico','undefined','ebay');

      my @filter = ('robots\.txt','favicon\.ico','undefined','ebay');

      Bitte was??
      Der Inhalt von Singlequotes wird _nicht_ interpoliert, somit wirst du mit \ keine Freude haben.

      1. Hoi,

        my(@filter) = ('robots.txt','favicon.ico','undefined','ebay');

        my @filter = ('robots\.txt','favicon\.ico','undefined','ebay');

        Bitte was??
        Der Inhalt von Singlequotes wird _nicht_ interpoliert, somit wirst du mit \ keine Freude haben.

        perldoc perlop

        Der Backslash _muss_ mit \ gequotet werden. Probiers aus.

        Gruesse,
         CK