abonnement Unibet Coolblue
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.
    pi_19833737
    tvp
    ik snap d'r nu geen f*ck van, maar dat komt vast als ik er aan begin. ken nu geen enkele programeertaal trouwens
    pi_19849720
    Is er eigenlijk ook een standaardfunctie voor random?
    Dus dat je net zoals bij Maple kan zeggen van ik wil dat random 1 of 2 gekozen wordt (of 0 of 1, etc ) en een scalar wordt?
    pi_19849951
    Ik heb misschien wel een manier gevonden
    quote:
    use strict;
    sub fisher_yates_shuffle {
    my $list = shift;
    my $i = @{$list};
    while ( $i-- ) {
    my $j = int rand( $i );
    @{$list}[$i,$j] = @{$list}[$j,$i];
    }
    }
    Dit is de Fisher-Yates shuffle.
    Als je nu een list maakt
    quote:
    my @numbers = ( 0 .. 2 );
    fisher_yates_shuffle(\@numbers);
    En daar de functie op loslaat...
    quote:
    my $my_number = shift @numbers;
    print
    "Het getal is $my_number";
    woeiiiiii

    oftewel:
    quote:
    sub fisher_yates_shuffle {
    my $list = shift;
    my $i = @{$list};
    while ( $i-- ) {
    my $j = int rand( $i );
    @{$list}[$i,$j] = @{$list}[$j,$i];
    }
    }
    my @numbers = ( 0 .. 2 );
    fisher_yates_shuffle(\@numbers);
    my $my_number = shift @numbers;
    print
    "Het getal is $my_number";
      zondag 13 juni 2004 @ 05:07:07 #129
    693 ChOas
    ** Warning: Choking hazard **
    pi_19850729
    quote:
    Op zondag 13 juni 2004 02:32 schreef CybErik het volgende:
    Ik heb misschien wel een manier gevonden
    [..]

    Dit is de Fisher-Yates shuffle.
    Als je nu een list maakt
    [..]

    En daar de functie op loslaat...
    [..]

    woeiiiiii

    oftewel:
    [..]
    Goed gevonden! maar fisher-yates is een beetje overkill om alleen een random getal te vinden. Je gebruikt het eerder om een lijst te randomizen...

    kijk maar:

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

    use strict;

    sub fisher_yates_shuffle {
    my $list = shift;
    my $i = @{$list};
    while ( $i-- ) {
    my $j = int rand( $i );
    @{$list}[$i,$j] = @{$list}[$j,$i];
    }
    }

    my @List=('a'..'z');
    print @List,"\n";
    fisher_yates_shuffle \@List;
    print @List,"\n";

    ---

    ChOas-Computer:~ choas$ ./randfok
    abcdefghijklmnopqrstuvwxyz
    zpkqbiyluevtfdwhrmxoajsgnc


    wat je moet weten is dat rand <getal> een random getal tussen de 0 en <getal> terug geeft... is
    handig, maar het getal is een float, dus dat betekent dat je bijvoorbeeld ook 1.463434242 terug kan krijgen.

    Hier heeft Perl de functie int voor, die neemt dan alleen het gedeelte voor de .

    Wil je nu bijvoorbeeld een paar getallen tussen de 0 en 10 doe je dit zo:

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

    use strict;

    for (1..5)
    {
    my $Number=int rand 11;
    print "$Number\n";
    };

    ---

    Output:

    ChOas-Computer:~ choas$ ./randfok
    3
    10
    9
    4
    2
    ChOas-Computer:~ choas$


    Iemand zin om de fisher-yates shuffle uit te leggen ? ... zo niet heb ik er misschien later vandaag wel tijd voor, maar ik beloof niets...

    [ Bericht 1% gewijzigd door ChOas op 13-06-2004 05:15: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]
      zondag 13 juni 2004 @ 14:25:18 #130
    25794 Detroit
    Per aspera ad astra
    pi_19855724
    Leuke cursus ChOas!
    So, if you're frightened of dying and... and you're holding on, you'll see devils tearing your life away. But if you've made your peace, then the devils are really angels...
    pi_19857815
    quote:
    Op zondag 13 juni 2004 05:07 schreef ChOas het volgende:
    Iemand zin om de fisher-yates shuffle uit te leggen ?
    Zo ingewikkeld is het niet. Waar het in feite op neer komt is dat je de lijst afloopt en ieder element met een willekeurig gekozen ander element omwisselt. (kleine verandering op fisher-yates tov ChOas:while($i--) wordt while(--$i), het is niet interresant om element 0 met zichzelf te wisselen ).

    sub fisher_yates_shuffle {
    # $list is een reference naar de array die je wil shuffelen
    my $list = shift;
    # het aantal elementen in de array wordt toegekent aan $i
    my $i = @{$list};
    # loop door de lus van $i-1 tot en met 1 (array loopt van 0...aantal elementen, maar laatste element
    # shufflen met zichzelf heeft weinig zin
    while ( --$i ) {
    # genereer een random getal tussen 0 en $i
    my $j = int rand( $i );
    # @{$list}[$j,$i] geeft een lijst met 2 waardes: @{$list}[$j] en @{$list}[$i]
    # deze wordt toegekend aan de lijst op posities $i en $j
    # $list is een referentie en daarom schrijven we @{$list}[..]
    @{$list}[$i,$j] = @{$list}[$j,$i];
    }
    }


    Een voorbeeld shuffle:
    lijst bij start: 'a','b','c','d'
    quote:
    iteratie 1: i=3, j=2 en de lijst wordt a b d c
    iteratie 2: i=2, j=1 en de lijst wordt a d b c
    iteratie 3: i=1, j=0 en de lijst wordt d a b c
    quote:
    iteratie 1: i=3, j=0 en de lijst wordt d b c a
    iteratie 2: i=2, j=1 en de lijst wordt d c b a
    iteratie 3: i=1, j=0 en de lijst wordt c d b a
      donderdag 24 juni 2004 @ 17:29:01 #132
    95998 -DailaLama-
    Het is Dalai, niet Daila!
    pi_20156964
    Weten jullie hier wat op?

    De vraag: Schrijf een functie die 4 letters als argumenten meekrijgt en alle mogelijke combinaties van deze letters afdrukt.

    dus
    AAAA
    AAAB
    AAAC
    AAAD
    AABA
    AABB
    ...
    ik weet wel hoe het moet, het klinkt eenvoudig, maar ik kom er niet uit
    pi_20159549
    quote:
    Op donderdag 24 juni 2004 17:29 schreef -DailaLama- het volgende:
    Weten jullie hier wat op?

    De vraag: Schrijf een functie die 4 letters als argumenten meekrijgt en alle mogelijke combinaties van deze letters afdrukt.

    dus
    AAAA
    AAAB
    AAAC
    AAAD
    AABA
    AABB
    ...
    ik weet wel hoe het moet, het klinkt eenvoudig, maar ik kom er niet uit
    wat dacht je hier van:

    sub combi {
      my @letters = split(//, $_[0]);
      foreach my $a (@letters) {
        foreach my $b (@letters) {
          foreach my $c (@letters) {
            foreach my $d (@letters) {
              print "$a$b$c$d\n";
            }
          }
        }
      }
    }

    misschien wat omslachtig, maar het werkt
    Trotse poster van het 37000000ste bericht ^O^
      vrijdag 25 juni 2004 @ 11:25:11 #134
    22343 Ruudboy
    Teruggekeerde fokkerd.
    pi_20174539
    Hey.. ik kom pas net dit topic tegen... super!
    Ik ga er eens aan beginnen.
    Sommige oenen draaien nog steeds databases op Windows , dus is wel handig als je scripts kunt maken die op unix en op windows draaien. Was al langer van plan eens naar Perl te kijken.

    Ik ga het eens proberen
    "Five out of four people have a problem with math."
      vrijdag 25 juni 2004 @ 14:45:27 #135
    95998 -DailaLama-
    Het is Dalai, niet Daila!
    pi_20179995
    quote:
    Op donderdag 24 juni 2004 19:40 schreef daReaper het volgende:

    [..]

    wat dacht je hier van:

    sub combi {
      my @letters = split(//, $_[0]);
      foreach my $a (@letters) {
        foreach my $b (@letters) {
          foreach my $c (@letters) {
            foreach my $d (@letters) {
              print "$a$b$c$d\n";
            }
          }
        }
      }
    }

    misschien wat omslachtig, maar het werkt
    Omslachtig? Dat is nog niets ...
    Ik had er gister een hele ingewikkelde bagger van met for en while lusjes.

    Bedankt!
    pi_20422467
    Schopje doormiddel van vraagje:

    Waarom werkt dit veelgebruikte voorbeeld op internet niet?:

    #!/usr/bin/perl

    use strict;

    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

    print $mon;


    Overigens doet ie het wel als ik use strict uit zet. En als ik localtime in een array dump (my @ltime = localtime()) doet ie het ook natuurlijk. Maar wat is er zo fout aan het gegeven voorbeeld?

    Is 'use strict' perse noodzakelijk?
    pi_20422720
    Ik geloof dat 'use strict' ervoor zorgt dat alleen vooraf gedefinieerde variabelen mogen worden gebruikt. Absoluut vereist is het dus niet, maar wel sterk aan te raden. Je kunt er hele vage dingen mee voorkomen.
    pi_20424284
    quote:
    Op maandag 5 juli 2004 09:29 schreef TimberWolf het volgende:
    Is 'use strict' perse noodzakelijk?
    use strict is datgene wat mist in php, een voorwaarde voor een serieuze taal, de constructie die mannen van jongens scheidt en/of schijdt

    Met strict moet je alle variabelen declareren bijvoorbeeld dmv my of local. In jouw voorbeeld declareer je variabelen niet en dus is dat fout.

    #!/usr/bin/perl -w

    use strict;

    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

    print $mon;

    zal dus wel werken. (Die -w bij de eerste regels is om wat meer "info" te gereneren, daarnaast kun je ook "use warnings" gebruiken.)
    quote:
    En als ik localtime in een array dump (my @ltime = localtime()) doet ie het ook natuurlijk.
    Maar
    my @ltime = localtime();
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=@ltime

    zal niet werken, maar
    my @ltime = localtime();
    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=@ltime
    wel
    pi_20429705
    om het verschil aan te geven:
    quote:
    #!/usr/bin/perl -w
    use strict;

    my $a = 5;

    sub functie1 {
    $a = 10;
    }

    sub functie2 {
    my $a = 20;
    }

    print $a;
    functie1();
    print $a;
    functie2();
    print $a;
    output = "51010"
    quote:
    #!/usr/bin/perl -w

    $a = 5;

    sub functie1 {
    $a = 10;
    }

    sub functie2 {
    $a = 20;
    }

    print $a;
    functie1();
    print $a;
    functie2();
    print $a;
    output = "51020"
    Trotse poster van het 37000000ste bericht ^O^
    pi_20441141
    Helemaal duidelijk. Dank Inmiddels heb ik mijn eerste echt nuttige script werkend 160 regels code (om en nabij) inclusief commentaar. Doet automatisch een bos plaatjes downloaden van een website (dagelijks dus) en daar automatisch een eigen pagina en archieven van maken enzo. Geeft vast nogal load op de server van de ontvangende partij, dus ik plaats um maar niet

    Ben ik overigens de enige die chOas mist?
      Eindredactie Games dinsdag 6 juli 2004 @ 15:07:13 #141
    19054 crew  Oscar.
    ElitePauper
    pi_20441426
    tvp
    0% vet, Geen suiker toegevoegd
    Twitter: @BuikschuiverNL
    Xbox Live: Buikschuiver
    Oscar, jij mag mijn landgoed als ik kom te overlijden. - Monkyyy
    pi_20442029
    quote:
    Op dinsdag 6 juli 2004 14:55 schreef TimberWolf het volgende:
    Geeft vast nogal load op de server van de ontvangende partij
    sleep int rand(3);
    oftewel wacht 0,1 of 2 seconden voor je het volgende plaatje ophaalt.
    quote:
    Ben ik overigens de enige die chOas mist?
    We missen hem allemaal
    pi_20443329
    quote:
    Op dinsdag 6 juli 2004 15:35 schreef devzero het volgende:
    sleep int rand(3);
    oftewel wacht 0,1 of 2 seconden voor je het volgende plaatje ophaalt.
    Ah, lief plan. Bouwen we wel in !

    Overigens zullen ze ook minder blij zijn met de verminderde bannerviews, but I could not care less
    quote:
    We missen hem allemaal
    *snif*
    pi_20444143
    mijn site bestaat ondertussen uit 233 kB perl code and counting ...
    Trotse poster van het 37000000ste bericht ^O^
      dinsdag 6 juli 2004 @ 17:14:45 #145
    693 ChOas
    ** Warning: Choking hazard **
    pi_20444835
    [i]#!/usr/bin/perl -w

    use strict;
    $|++;@_=split//,
    "|Just Another Perl Hacker|";
    sub ll{select(undef,undef,undef,
    0.05);}; my @l;$"="";for(0..12){
    ll;splice@l,@l/2, 0,@_[$_,-$_-1]
    ;print' 'x13,"@l\r";};while (1){
    @l=@_;for(0..11){pop@l;shift@l;
    ll;print "\r",' 'x(13+$_)," @l "
    ;};ll;ll;ll;for(reverse 1..12){
    splice@l,-1,0,$_[$_-1];splice@l,
    0,0,$_[-$_-1];ll;print"\r",' 'x(
    13+$_), "@l \b\b\b ";};ll;ll;
    ll;@_=reverse@_;};

    Oftewel... IK BEN ER WEER!!!!!

    Zo... vragen ? .... wat gaan we doen ? ... Ik heb er weer zin in

    [ Bericht 8% gewijzigd door ChOas op 06-07-2004 21:02:46 ]
    "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]
      dinsdag 6 juli 2004 @ 17:16:47 #146
    693 ChOas
    ** Warning: Choking hazard **
    pi_20444892
    Kut... forum gaat opeens allerlei dingen escapen

    [code]
    \\\\\\\'test\\\\\\\'
    [/code]

    [php]
    \\\'test2\\\'
    [/php]

    Ooooooooooooooooh wat sucked dat verschrikkelijk... zo is er geen beginnen aan
    "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]
      dinsdag 6 juli 2004 @ 21:03:33 #147
    693 ChOas
    ** Warning: Choking hazard **
    pi_20448195
    escape probleem is gefixed, bovenstaande obfuscated code werkt weer

    Dus... wat gaan we nu doen ?
    "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_20448666
    quote:
    Op dinsdag 6 juli 2004 21:03 schreef ChOas het volgende:
    escape probleem is gefixed, bovenstaande obfuscated code werkt weer

    Dus... wat gaan we nu doen ?
    OO
    Trotse poster van het 37000000ste bericht ^O^
      dinsdag 6 juli 2004 @ 21:50:31 #149
    693 ChOas
    ** Warning: Choking hazard **
    pi_20449313
    quote:
    Op dinsdag 6 juli 2004 21:23 schreef daReaper het volgende:

    [..]

    OO


    Ja, jij bent er wel klaar voor

    OO it is...

    Maar dan moet ik wel gaan vooorbereiden...

    Okay... bij geen tegenstemmen is de volgende les: Packages!!!!!!!

    Eeeerm... wacht... misschien moet ik eerst iets meer over scope gaan uitleggen (zag dat jullie dat ook al een begin gemaakt hadden)

    Eerst scope, en dan packages/OO Perl
    "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_20451555
    En wie weet iets over het outputten van HTML? De 'print <<DINGES;" constructie? Het escapen van lastige codes? Wanneer wel en wanneer niet escapen enzo? Het verschil tussen "$string" en '$string'?

    (Jah, allemaal dingen die ik inmiddels zelf ontdekt heb )
    abonnement Unibet Coolblue
    Forum Opties
    Forumhop:
    Hop naar:
    (afkorting, bv 'KLB')