[perl] reg.exp. wil niet herevalueren

Pagina: 1
Acties:

  • Algurgazan
  • Registratie: Juli 2002
  • Laatst online: 09-04 13:59
ik zit met een probleempje met perl, en kom er niet meer uit, dus ben ik hier aangeland.

wat ik probeer te doen is het volgende: omdat ik nogal eens de bus mis wil ik een simpel scriptje maken dat de halte tijden tabel van diverse bussen van de dichtsbijzijnde bushalte haalt en weergeeft (ik knal het scriptje in samurize als het gaat werken..)

dit ben ik in elkaar aan het draaien in perl, alleen ben ik daar op zn zachts gezegd niet echt een held in, en ik ben nu dus ook nogal vastgelopen.

wat ik wil doen is het volgende:

per buslijn haalt het script de halte tabel op van de site van connexxion, vervolgens probeer ik met een reguliere expressie eruit te halen op welke tijden de betreffende bus dit uur rijdt. dat gaat op dit moment ongeveer als volgt:

code:
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
sub lijntijd 
{

$hour = $_[0];
$lijn = $_[1];
$date = $_[2];

$a = &getHttp("www.connexxion.nl", "/dienstregeling/haltevertrekstaat.asp?lijn=H0" . $lijn . "&halte=50100120&richting=2&datum=" . $date);


@resultaat = &filter($a, $hour, $lijn);

}

sub filter 
{

my $website = $_[0];
my $hour = $_[1];
my $lijn = $_[2];

if ($wday > 1 ) 
    {
        if ($website =~ /nummer\">$lijn<\/td>/)
        {

                $website =~ /maandag.*?='uur'>$hour<\/td><td>&nbsp;(.*?)<td width/; #haalt de gegevens van het huidige uur op
                return ($1 =~ /(\d\d)/g);

        }
    }
}


het probleem echter is dat de gegevens van het huidige uur (regel 27) telkens terug gegeven worden van de eerste buslijn, hoewel ik toch heb gecontroleerd (niet alleen met regel 24, maar ook door de string te printen etc.) dat er steeds een website van een andere buslijn meegegeven wordt. mij lijkt het dan ook dat de expressie maar een keer geevalueerd wordt, en dat de volgende aanroepen gewoon het eerste antwoord weer teruggegeven wordt.

wat ik dus gedaan heb is precies uitzoeken of er wel telkens de goede website meegegeven wordt (dus van de bijbehorende buslijn en niet weer van de eerste) en dat is zo. maar daar wordt vervolgens niks mee gedaan.

ik heb het idee dat ik iets absoluut niet goed doe, maar wat precies weet ik niet, en hoe ik het recht zou moeten breien kan ik ook niks over vinden. (heb al zitten lezen in de regexp tut op perl.org maar daar wordt ik met betrekking op dit probleem ook niet zoveel wijzer van...)

"When you hear the beeb, it will be three o'clock." | muzak


  • Algurgazan
  • Registratie: Juli 2002
  • Laatst online: 09-04 13:59
bump... ik heb nog steeds het probleem niet kunnen achterhalen helaas...

"When you hear the beeb, it will be three o'clock." | muzak


  • Juup
  • Registratie: Februari 2000
  • Niet online
1. Je hebt niet het hele script gepost, dus wij wetene niet hoe getHttp eruitziet etc.
2. Als je vastloopt, zet dan strict en warnings aan en los alle errors op, dat lost al 80% van alle problemen op.
3. Je doet erg moeilijk. 3 regexen om 1 waarde uit 1 string te halen is nogal overdreven.
Waarom niet iets zoals dit:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use warnings;

sub lijntijd 
{
  my $hour = shift;
  my $lijn = shift;
  my $date = shift;

  my $website = getHttp("www.connexxion.nl", "/dienstregeling/haltevertrekstaat.asp?lijn=H0" . $lijn . "&halte=50100120&richting=2&datum=" . $date);
  if ($website =~ /maandag.*?='uur'>$hour<\/td><td>&nbsp;(\d\d)<td width/)
  {
    print $1;
  }
}

(ongetest)

[ Voor 20% gewijzigd door Juup op 10-09-2005 15:59 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Algurgazan
  • Registratie: Juli 2002
  • Laatst online: 09-04 13:59
hmm.. de code die jij aangeeft lost niks op (sterker nog, die geeft geen resultaat terug) maar ik heb inderdaad eens met strict gecompileerd, en toen begon de compiler nogal te zeuren over dat ik alle variabelen globaal gedeclareerd had en dat ie graag een package name wilde... toen heb ongeveer alle variabelen met "my [variabele]" gedeclareerd, en toen ging het opeens wel goed... dus het probleem is in ieder geval opgelost.

dank voor de hulp!

"When you hear the beeb, it will be three o'clock." | muzak


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
volgens mij gaat ie als je 'if $website' doet 1x kijken op de eerste regel.

als je alle regels wilt kan je eens proberen:
code:
1
2
3
foreach my $line (split(/\/n/, $website)){
   if ($line =~ /nummer\">$lijn<\/td>/)
}