abonnementen ibood.com bol.com Gearbest
pi_19787808
quote:
Op woensdag 9 juni 2004 22:43 schreef ChOas het volgende:
Oh, en ik vraag me af wie ik moet pijpen voor een fucking schouderklopje, maar daar kom ik nog wel achter
Eerst de cursus afmaken en misschien dat we een dig-mod zover krijgen dat je naam in de hall of fame komt
  donderdag 10 juni 2004 @ 17:12:03 #102
693 ChOas
** Warning: Choking hazard **
pi_19788313
quote:
Op donderdag 10 juni 2004 15:34 schreef Wouta het volgende:
Sorry hoor dat ik weer een vraag ga stellen....

Ik heb een vraag over het volgende voorbeeld:
[..]

Dat werkt gewoon wat ik me nu af vraag is waarom er een $ staat ipv een @ als je de fruit soorten gaat printen. Ik heb er een @ neergezet en toen ging perl heel bijdehand mij vertellen dat ik beter een $ kon gebruken. Maar helemaal snappen waarom ik geen @ moeten gebruiken daar doe ik niet.

Iemand die dat even wat wil verhelderen ?
Inderdaad, wat CybErik zegt. Je hebt het over een element uit de list, wat een scalar is, en geen list...

Dus:

@List <- List
$List[<getal>] <- Element uit een list
@List[3,4] <- Elementen 3 en 4 uit een list (en het zijn meerdere elementen, dus da's dan weer een list

Ik ga even een stukje schrijven over om een Apache log te parsen met behulp van regexps.
"I contend that we are both atheists. I just believe in one fewer god than you do.
When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

[Stephen Roberts]
pi_19788883
quote:
Op donderdag 10 juni 2004 15:34 schreef Wouta het volgende:
Ik heb een vraag over het volgende voorbeeld:
Een ander voorbeeld/


#!/usr/bin/perl -w
use strict;

# een array met references naar een "anonieme" hash. Anoniem want er is alleen de referentie
# geen "echte" variabele
my @Fruit = ( {'Naam' => 'Appel', 'Prijs' => 1.23},
{'Naam' => 'Peer', 'Prijs' => 2.24});

my $index;

# by elke iteratie refereert $index naar een van de hashes uit de lijst
foreach $index(@Fruit) {
# en de waarde wordt toegekent aan %veld
my %veld = %{$index};
print "Ik heb zin in een $veld{'Naam'} en dat kost me $veld{'Prijs'}\n";
}

# doet het zelfde
foreach (@Fruit) { print "Ik heb zin in een ${$_}{'Naam'} en dat kost me ${$_}{'Prijs'}\n"; }


Er zit echter 1 verschil tussen beide methods. Bij methode 1 druk je een copie af van @Fruit en bij methode 2 de werkelijke waardes. Voor afdrukken maakt dat niets uit, maar als je dingen (zoals de prijs) wil veranderen dan werkt methode 1 niet, want na iedere iteratie gooi je %veld weer weg.

Bijvoorbeeld

my $index;
foreach $index(@Fruit) {
my %veld = %{$index};
# verandert alleen $veld{'Prijs'} en niet @Fruit
$veld{'Prijs'}=$veld{'Prijs'}*2;
print "Ik heb zin in een $veld{'Naam'} en dat kost me $veld{'Prijs'}\n";
}

foreach (@Fruit) { print "Ik heb zin in een ${$_}{'Naam'} en dat kost me ${$_}{'Prijs'}\n"; }

geeft als uitvoer

Ik heb zin in een Appel en dat kost me 2.46
Ik heb zin in een Peer en dat kost me 4.48
Ik heb zin in een Appel en dat kost me 1.23
Ik heb zin in een Peer en dat kost me 2.24
  donderdag 10 juni 2004 @ 17:53:01 #104
693 ChOas
** Warning: Choking hazard **
pi_19789441
-edit-
"I contend that we are both atheists. I just believe in one fewer god than you do.
When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

[Stephen Roberts]
  donderdag 10 juni 2004 @ 18:03:47 #105
693 ChOas
** Warning: Choking hazard **
pi_19789720
This lesson was sponsored by TimberWolf's logging

Okay... we willen wat nuttige informatie uit een logfile van Apache halen...

Eerst het ALLERbelangrijkste van programeren: Data analyse

Dit wil zeggen: HOE ziet onze data er uit, en HOE willen we hem hebben om te bewerken.

Dus... bij deze, een paar regeltjes log:

213.84.91.93 - - [09/Jun/2004:15:24:59 +0200] "GET /Includes/header.inc.php HTTP/1.0" 200 1340 "-" "PHP/4.2.2"
213.84.91.93 - - [09/Jun/2004:15:24:59 +0200] "GET /Includes/footer.inc.php HTTP/1.0" 200 18 "-" "PHP/4.2.2"
209.237.238.176 - - [09/Jun/2004:15:24:59 +0200] "GET /help/homepage.php HTTP/1.0" 200 2488 "-" "ia_archiver"
218.24.32.56 - - [09/Jun/2004:17:58:46 +0200] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.0" 404 285 "-" "-"
192.168.0.9 - - [09/Jun/2004:19:39:10 +0200] "GET / HTTP/1.1" 200 3283 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
192.168.0.9 - - [09/Jun/2004:19:39:10 +0200] "GET /include/valid-html401 HTTP/1.1" 200 2948 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
192.168.0.9 - - [09/Jun/2004:19:39:10 +0200] "GET /include/vcss HTTP/1.1" 200 1547 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
192.168.0.9 - - [09/Jun/2004:19:39:11 +0200] "GET /back.gif HTTP/1.1" 200 525 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
192.168.0.9 - - [09/Jun/2004:19:39:13 +0200] "GET /adddomain.php HTTP/1.1" 200 3503 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
192.168.0.9 - - [09/Jun/2004:19:39:17 +0200] "POST /adddomain.php HTTP/1.1" 200 3563 "http://xyz.meanframe.com/adddomain.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"


Kijk nou maar eens rustig 5 minuutjes hier naar, en probeer te ontdekken wat het patroon is in de logfiles.


...

*naar koelkast loopt*

*biertje scoort*

...

Klaar ?

Okay... dit zie ik: Ik kan geen split gebruiken want ik zou dan op spatie willen splitten, maar dat kan niet omdat ik dan ook elementen splits zoals "GET /include/vcss HTTP/1.1" en dat willen we niet....

Dan maar eens kijken hoe we hier een regexp op kunnen matchen die ook geldt voor alle andere regels:

192.168.0.9 - - [09/Jun/2004:19:39:10 +0200] "GET / HTTP/1.1" 200 3283 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

  • IP adres, simpel: \S+ < alles wat geen spatie is.
  • een of meerdere whitespaces: \s+
  • Teken, ik weet niet of dit altijd een '-' is, maar ik neem geen risico, dus weer: \S+
  • een of meerdere whitespaces: \s+
  • Teken, ik weet niet of dit altijd een '-' is, maar ik neem geen risico, dus weer: \S+
  • een of meerdere whitespaces: \s+
  • Leuke ... '[' gevolgd door watdanook en dan een ']' , aangezien we [ en ] voor character
    classes gebruiken moeten we een '\' voor deze characters zetten. dit wordt: \[.*\]
  • een of meerdere whitespaces: \s+
  • Bijna als de een na laatste: " gevolgd door watdanook, gevolgd door " doen we zo: ".*"
  • een of meerdere whitespaces: \s+
  • Getal: \d+
  • een of meerdere whitespaces: \s+
  • Getal: \d+
  • een of meerdere whitespaces: \s+
  • al gezien: ".*"
  • een of meerdere whitespaces: \s+
  • al gezien: ".*"

    Nou!... koekie toch ?

    Hoe ziet de regexp er nu uit ? :

    /\S+\s+\S+\s+\S+\s+\[.*\]\s+".*"\s+\d+\s+\d+\s+".*"\s+".*"/

    Lekker hoor

    Kijken of het werkt ?

    ---
    #!/usr/bin/perl -w

    use strict;

    my @Data;

    $Data[0]='213.84.91.93 - - [09/Jun/2004:15:24:59 +0200] "GET /Includes/header.inc.php HTTP/1.0" 200 1340 "-" "PHP/4.2.2"';
    $Data[1]='213.84.91.93 - - [09/Jun/2004:15:24:59 +0200] "GET /Includes/footer.inc.php HTTP/1.0" 200 18 "-" "PHP/4.2.2"';
    $Data[2]='209.237.238.176 - - [09/Jun/2004:15:24:59 +0200] "GET /help/homepage.php HTTP/1.0" 200 2488 "-" "ia_archiver"';
    $Data[3]='218.24.32.56 - - [09/Jun/2004:17:58:46 +0200] "GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.0" 404 285 "-" "-"';
    $Data[4]='192.168.0.9 - - [09/Jun/2004:19:39:10 +0200] "GET / HTTP/1.1" 200 3283 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"';
    $Data[5]='192.168.0.9 - - [09/Jun/2004:19:39:10 +0200] "GET /include/valid-html401 HTTP/1.1" 200 2948 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"';
    $Data[6]='192.168.0.9 - - [09/Jun/2004:19:39:10 +0200] "GET /include/vcss HTTP/1.1" 200 1547 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"';
    $Data[7]='192.168.0.9 - - [09/Jun/2004:19:39:11 +0200] "GET /back.gif HTTP/1.1" 200 525 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"';
    $Data[8]='192.168.0.9 - - [09/Jun/2004:19:39:13 +0200] "GET /adddomain.php HTTP/1.1" 200 3503 "http://xyz.meanframe.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"';
    $Data[9]='192.168.0.9 - - [09/Jun/2004:19:39:17 +0200] "POST /adddomain.php HTTP/1.1" 200 3563 "http://xyz.meanframe.com/adddomain.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"';

    my $i=0;
    for (@Data)
    {
    print "$i is een Apache logregel!\n" if (/\S+\s+\S+\s+\S+\s+\[.*\]\s+".*"\s+\d+\s+\d+\s+".*"\s+".*"/);
    $i++;
    };


    ---

    En tadaaaa:

    choas:~ choas$ ./les15
    0 is een Apache logregel!
    1 is een Apache logregel!
    2 is een Apache logregel!
    3 is een Apache logregel!
    4 is een Apache logregel!
    5 is een Apache logregel!
    6 is een Apache logregel!
    7 is een Apache logregel!
    8 is een Apache logregel!
    9 is een Apache logregel!
    choas:~ choas$


    En het kloterige is dat ik ook greedy matching uit wou leggen in deze les, maar mijn regexp was te goed

    En waarom de regexp die we net hebben gezien volkomen klote is, zien we straks

    [ Bericht 2% gewijzigd door ChOas op 10-06-2004 18:12:16 ]
  • "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
    pi_19794652
    Even wat uitleg over de log, voor het geval begrip indeze handig is. Een apache log regel bestaat uit een vast aantal elementen, Beginnend met het 'Request IP', oftewel het IP adres van de webbrowser die de pagina opvraagt. Dan '\ \-\ \-\ ', oftewel spatie min spatie min spatie. Dan de datum, tijd en tijdzone-modifier tussen blokhaken. Als laatste de request zelf, dus de GETs en POSTs. Deze staan tussen quotes.
    Overigens leuk te zien: Regel 4 is een of andere dwaas die een populair exploit voor IIS probeert uit te voeren. Dat gebeurd wel meer

    Wellicht is het leuk om via een regex de IP adressen uit de logfile te toveren? IP adressen zijn altijd wel leuk voor regex uitleg volgens mij
      donderdag 10 juni 2004 @ 21:41:46 #107
    693 ChOas
    ** Warning: Choking hazard **
    pi_19795788
    quote:
    Op donderdag 10 juni 2004 21:08 schreef TimberWolf het volgende:
    Even wat uitleg over de log, voor het geval begrip indeze handig is. Een apache log regel bestaat uit een vast aantal elementen, Beginnend met het 'Request IP', oftewel het IP adres van de webbrowser die de pagina opvraagt. Dan '\ \-\ \-\ ', oftewel spatie min spatie min spatie. Dan de datum, tijd en tijdzone-modifier tussen blokhaken. Als laatste de request zelf, dus de GETs en POSTs. Deze staan tussen quotes.
    Overigens leuk te zien: Regel 4 is een of andere dwaas die een populair exploit voor IIS probeert uit te voeren. Dat gebeurd wel meer

    Wellicht is het leuk om via een regex de IP adressen uit de logfile te toveren? IP adressen zijn altijd wel leuk voor regex uitleg volgens mij
    Even een hele snelle:

    Je moet weten dat $& de match is van een reguliere expressie.. en als het goed is kan jij me uitleggen wat dit programma doet (Neem aan dat INPT de geopende filehandle van je Apache log is):

    ---
    my %Once;
    while (<INPT>)
    {
    if (/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {$Once{$&}++};
    };


    Wat staat er nu in de hash %Once ?

    [ Bericht 0% gewijzigd door ChOas op 10-06-2004 22:01:16 ]
    "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
    pi_19796496
    quote:
    Op donderdag 10 juni 2004 21:08 schreef TimberWolf het volgende:
    Even wat uitleg over de log, voor het geval begrip indeze handig is. Een apache log regel bestaat uit een vast aantal elementen,
    N.B. Denk er wel aan dat dat afhankelijk is van je logformaat in je httpd.conf. Er zijn wel een aantal "standaard" logformaten (bv LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined) maar de machine waarop je je paginaatje host kan een andere methode hebben.
    quote:
    Wellicht is het leuk om via een regex de IP adressen uit de logfile te toveren? IP adressen zijn altijd wel leuk voor regex uitleg volgens mij
    Mits HostnameLookups Off in httpd.conf:
    awk '{print $1}' /var/log/httpd-access.log | sort | uniq -c | sort -n
      donderdag 10 juni 2004 @ 22:15:21 #109
    693 ChOas
    ** Warning: Choking hazard **
    pi_19796856
    quote:
    Op donderdag 10 juni 2004 22:02 schreef devzero het volgende:

    [..]

    N.B. Denk er wel aan dat dat afhankelijk is van je logformaat in je httpd.conf. Er zijn wel een aantal "standaard" logformaten (bv LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined) maar de machine waarop je je paginaatje host kan een andere methode hebben.
    [..]

    Mits HostnameLookups Off in httpd.conf:
    awk '{print $1}' /var/log/httpd-access.log | sort | uniq -c | sort -n
    Perl!

    perl -e '$x{substr $_,0,index $_," "}++ while<>;print join"\n",keys %x,"\n"' /var/log/httpd-access.log

    Ik gok dat het sneller is
    "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
    pi_19797255
    quote:
    Op donderdag 10 juni 2004 22:15 schreef ChOas het volgende:
    Perl!
    Moest even trollen. Maar perl is hier sneller, maar je gaat awk ook niet gebruiken om 1 string af te drukken.
    quote:
    if (/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {$Once{$&}++};
    Overigens nog wat meer roet: vergeet niet dat je naast ipv4 nummers ook ipv6 nummers hebt. Bijvoorbeeld:
    quote:
    2001:838:9999:1234:201:2ff:fe10:62ca - - [10/Jun/2004:22:24:31 +0200] "GET / HTTP/1.1" 200 213 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7b) Gecko/20040421"
      donderdag 10 juni 2004 @ 22:32:53 #111
    693 ChOas
    ** Warning: Choking hazard **
    pi_19797400
    quote:
    Op donderdag 10 juni 2004 22:28 schreef devzero het volgende:

    [..]

    Moest even trollen. Maar perl is hier sneller, maar je gaat awk ook niet gebruiken om 1 string af te drukken.
    [..]

    Overigens nog wat meer roet: vergeet niet dat je naast ipv4 nummers ook ipv6 nummers hebt. Bijvoorbeeld:
    [..]
    Dan gebruik je deze :

    ++$Once{substr $_,0,index $_," "}

    Is sowieso takke sneller omdat je geen regex machine ingaat... je gaat er alleen maar vanuit dat het eerste element voor de spatie het adres is
    "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
    pi_19797477
    quote:
    Op donderdag 10 juni 2004 22:32 schreef ChOas het volgende:
    ++$Once{substr $_,0,index $_," "}

    Is sowieso takke sneller omdat je geen regex machine ingaat... je gaat er alleen maar vanuit dat het eerste element voor de spatie het adres is
    Ok, daar heb je gelijk mee. Ik kan me alleen wel applicaties voorstellen waar je niet het hele address maar alleen het netwerk wil hebben (wat bij ipv6 makkelijk is, ipv4 hak je maar in het wilde weg zonder netmask, bv in squid.conf "client_netmask").
    pi_19803516
    quote:
    Op donderdag 10 juni 2004 21:41 schreef ChOas het volgende:
    my %Once;
    while (<INPT>)
    {
    if (/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {$Once{$&}++};
    };


    Wat staat er nu in de hash %Once ?
    Op gevoel zeg ik dat er de ip-adressen in staan (dat is wat de regex matched). De constructie $once{regexresultaat}++ snap ik zeg maar bijna
    quote:
    Op donderdag 10 juni 2004 22:02 schreef devzero het volgende:
    N.B. Denk er wel aan dat dat afhankelijk is van je logformaat in je httpd.conf. Er zijn wel een aantal "standaard" logformaten (bv LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined) maar de machine waarop je je paginaatje host kan een andere methode hebben.
    Vanzelfsprekend. Maar er is natuurlijk via een regex-match wel te kijken welk logformat er gebruikt wordt. Aan het 'uiterlijk' van de data valt redelijk simpel te herkennen wat voor data het is tenslotte. Dit is overigens, voor zover ik weet, zo'n beetje de Apache default.
    quote:
    Overigens nog wat meer roet: vergeet niet dat je naast ipv4 nummers ook ipv6 nummers hebt.
    En die zijn leuker, want die bestaan niet altijd uit even veel octets Nouja, ze worden niet altijd getoond zeg maar. Dus ipv6 maakt het regex matchen wel een stuk spannender

    Hoedanook, ik wacht gespannen op de volgende les
    pi_19803873
    Hah. Net mijn eerste Perl programma gemaakt. Ik ben zo blij Stelt niet veel voor, maar werkt wel:

    #!/usr/bin/perl -w

    use strict;

    # Subs

    sub CheckLine
    {
    # Flikker het zoekwoord in een var
    my $Zoek=shift;
    # En de uitgelezen regel ook maar
    my $Regel=shift;

    # Controleer of het zoekwoord in de regel zit.
    if ($Regel =~ $Zoek)
    {
    print $Regel;
    }
    }

    # Definities

    my $Bestandsnaam='/var/log/httpd/access_log';
    my $ZoekTerm;
    my $Paniek =0;

    # Open het accesslog bestand

    $Paniek=open LOGFILE,$Bestandsnaam;

    if (!$Paniek)
    {
    print "Help! Er ging iets mis met het openen van het bestand!\n";
    exit;
    }

    # Vraag input
    print "Waar gaan we naar zoeken? ";

    $ZoekTerm = <STDIN>;

    # Vieze enters eraf slopen

    chomp $ZoekTerm;

    # Lees het bestand regel voor regel
    while (<LOGFILE>)
    {
    CheckLine $ZoekTerm,$_;
    }

    close LOGFILE;

    Het kan allemaal vast veel makkelijker en mooier, maargoed
      vrijdag 11 juni 2004 @ 15:54:13 #115
    693 ChOas
    ** Warning: Choking hazard **
    pi_19813109
    quote:
    Op vrijdag 11 juni 2004 08:50 schreef TimberWolf het volgende:
    Hah. Net mijn eerste Perl programma gemaakt. Ik ben zo blij Stelt niet veel voor, maar werkt wel:

    [ code ]
    Cooool!... gefeliciteerd!!!
    "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
      vrijdag 11 juni 2004 @ 16:03:27 #116
    693 ChOas
    ** Warning: Choking hazard **
    pi_19813407
    Capturen uit regexps

    Nou, dat we regexps op een scalar kunnen loslaten is natuurlijk al erg mooi, maar nog beter,
    we kunnen informatie uit de scalar halen met dezelfde regexp.

    Wanneer je ( en ) om een item in je regexp zet zal deze gecaptured worden naar een Perl
    variabele... de eerste () komt in $1, de tweede $2, etc...

    Ik zal dit laten zien aan de hand van het loopje uit het laatste voorbeeld:

    ---
    for (@Data)
    {
    # We willen weten WIE ons bezocht, om hoe laat, en welke browser deze persoon gebruikte
    # Dus we zetten ( en ) om de velden die die informatie bevatten:
    if (/(\S+)\s+\S+\s+\S+\s+\[(.*)\]\s+".*"\s+\d+\s+\d+\s+".*"\s+"(.*)"/)
    {
    my ($IPaddress,$Time,$Browser)=($1,$2,$3);
    # werkte het ?:

    print "Op $Time bezocht een gebruiker met adres $IPaddress deze site met de volgende browser: $Browser\n";
    };
    };


    En testen:

    ChOas-Computer:~ choas$ ./les17
    Op 09/Jun/2004:15:24:59 +0200 bezocht een gebruiker met adres 213.84.91.93 deze site met de volgende browser: PHP/4.2.2
    Op 09/Jun/2004:15:24:59 +0200 bezocht een gebruiker met adres 213.84.91.93 deze site met de volgende browser: PHP/4.2.2
    Op 09/Jun/2004:15:24:59 +0200 bezocht een gebruiker met adres 209.237.238.176 deze site met de volgende browser: ia_archiver
    Op 09/Jun/2004:17:58:46 +0200 bezocht een gebruiker met adres 218.24.32.56 deze site met de volgende browser: -
    Op 09/Jun/2004:19:39:10 +0200 bezocht een gebruiker met adres 192.168.0.9 deze site met de volgende browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    Op 09/Jun/2004:19:39:10 +0200 bezocht een gebruiker met adres 192.168.0.9 deze site met de volgende browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    Op 09/Jun/2004:19:39:10 +0200 bezocht een gebruiker met adres 192.168.0.9 deze site met de volgende browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    Op 09/Jun/2004:19:39:11 +0200 bezocht een gebruiker met adres 192.168.0.9 deze site met de volgende browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    Op 09/Jun/2004:19:39:13 +0200 bezocht een gebruiker met adres 192.168.0.9 deze site met de volgende browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    Op 09/Jun/2004:19:39:17 +0200 bezocht een gebruiker met adres 192.168.0.9 deze site met de volgende browser: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    ChOas-Computer:~ choas$


    Nou... is dat handig, of is dat handig ????
    "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
      vrijdag 11 juni 2004 @ 16:10:38 #117
    693 ChOas
    ** Warning: Choking hazard **
    pi_19813622
    Kan ook:

    ---
    my %Browsers;
    for (@Data)
    {
    # We willen weten WIE ons bezocht, om hoe laat, en welke browser deze persoon gebruikte
    # Dus we zetten ( en ) om de velden die die informatie bevatten:
    if (/(\S+)\s+\S+\s+\S+\s+\[(.*)\]\s+".*"\s+\d+\s+\d+\s+".*"\s+"(.*)"/)
    {
    my ($IPaddress,$Time,$Browser)=($1,$2,$3);
    # werkte het ?:
    $Browsers{$Browser}{$IPaddress}++;
    # print "Op $Time bezocht een gebruiker met adres $IPaddress deze site met de volgende browser: $Browser\n";
    };
    };

    for my $Browser (keys %Browsers)
    {
    print "Gebruikers met een $Browser browser:\n";
    print "$_ : $Browsers{$Browser}{$_} keer\n" for keys %{$Browsers{$Browser}};
    };


    Output:

    ChOas-Computer:~ choas$ ./les17b
    Gebruikers met een Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) browser:
    192.168.0.9 : 6 keer
    Gebruikers met een ia_archiver browser:
    209.237.238.176 : 1 keer
    Gebruikers met een PHP/4.2.2 browser:
    213.84.91.93 : 2 keer
    Gebruikers met een - browser:
    218.24.32.56 : 1 keer
    ChOas-Computer:~ choas$


    [ Bericht 96% gewijzigd door ChOas op 11-06-2004 16:17:44 ]
    "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
    pi_19814356
    Ben sinds kort ook begonnen met Perl.

    Leuk dit topic!
      zaterdag 12 juni 2004 @ 00:12:55 #119
    693 ChOas
    ** Warning: Choking hazard **
    pi_19825387
    Om persoonlijke redenen zal ik hier de komende 1.5 week niet kunnen zijn.

    Geen vrees, hierna kom ik terug en gaan we gewoon door.

    Misschien ben ik in staat om tussendoor een paar vraagjes te beantwoorden, maar
    reken er niet op. Ik heb al gezien dat er hier al een x aantal andere Perl programeurs
    zijn die in die gevallen ook kunnen helpen... thanks

    Tot de volgende les!
    "I contend that we are both atheists. I just believe in one fewer god than you do.
    When you understand why you dismiss all the other possible gods, you will understand why I dismiss yours."

    [Stephen Roberts]
    pi_19830046
    tvp
    A command line lets you get intimate with your computer, data and protocols. GUIs are like wearing full body condoms.
    pi_19830542
    Zeer interessant topic!

    Als ik klaar ben met me repetitieweek ga ik ook maar eens Perl proberen
    pi_19830682
    quote:
    Op woensdag 9 juni 2004 22:43 schreef ChOas het volgende:
    Oh, en ik vraag me af wie ik moet pijpen voor een fucking schouderklopje, maar daar kom ik nog wel achter
    Je hebt hardgenoeg gezogen schouderklopjes :')
      zaterdag 12 juni 2004 @ 11:39:40 #123
    65516 gieling
    Live from NYC
    pi_19831236
    quote:
    Op zaterdag 12 juni 2004 10:53 schreef Ferdy het volgende:
    Zeer interessant topic!

    Als ik klaar ben met me repetitieweek ga ik ook maar eens Perl proberen
    Jij ook al?
    pi_19832989
    Wie is de man? Juistem .

    Na de 22e ga ik lekker klooien
    Don't think you are, know you are.
    http://forum.fok.nl/topic/258357
      zaterdag 12 juni 2004 @ 13:30:41 #125
    33470 FlyingFox
    Zeer schier.
    pi_19833249
    Het heeft wel wat weg van WireFusion.
    abonnementen ibood.com bol.com Gearbest
    Forum Opties
    Forumhop:
    Hop naar:
    (afkorting, bv 'KLB')