[perl] $replacement in regex wordt niet ge-re-evalueerd

Pagina: 1
Acties:

  • pinball
  • Registratie: Oktober 1999
  • Niet online

pinball

Electric Monk

Topicstarter
Ik wil een stukje in een link vervangen door een dagnummer om uiteindelijk zoiets:
te printen.

Nou leek mij dat simpel te regelen met:
code:
1
2
3
4
5
6
7
#!/usr/bin/perl
use strict;
my($link,$aantaldagen) = @ARGV;
for (my $i = 1; $i <= $aantaldagen; $i++ ) {
        $link =~ s/\*\*/$i/;
        print "$i\t$link\n";
}


ik geef dan:
http://www.mijndomein.nl/dir/sub/archives-**.html 70
als parameters mee, en de ** zouden steeds vervangen moeten worden door $i, maar dit gebeurt maar 1 keer.
Zoekwerk leert dat dit gedrag beinvloed wordt door de /o optie, uit perlrequick:
perl has to re-evaluate $pattern each time through the loop. If $pattern won't be changing, use the //o modifier, to only perform variable substitutions once.
maar ik wil juist het tegenovergestelde!

Weet iemand hoe ik kan bereiken dat $pattern steeds opnieuw geevalueerd wordt?
Ik heb de /e modifier geprobeerd, en er ook eval{} omheen gezet, ik heb de regex in een subroutine gezet, ik heb een extra variabele gebruikt om $i aan toe te wijzen, maar niets hielp.

Uiteindelijk is het met een lelijke omweg:
code:
1
2
3
4
my $link2 = $link;
$link2 =~ /(.+)\*\*(.+)/;
$link2 = "$1$i$2";
print "$i\t$link2\n";

wel gelukt, maar ondertussen vraag ik me wel af of het gewoon echt niet kan, of dat ik iets over het hoofd zie.

Whenever you find that you are on the side of the majority, it is time to reform.


Verwijderd

pinball schreef op donderdag 24 maart 2005 @ 11:12:
code:
1
2
3
4
5
6
7
#!/usr/bin/perl
use strict;
my($link,$aantaldagen) = @ARGV;
for (my $i = 1; $i <= $aantaldagen; $i++ ) {
        $link =~ s/\*\*/$i/;
        print "$i\t$link\n";
}


ik geef dan:
http://www.mijndomein.nl/dir/sub/archives-**.html 70
als parameters mee, en de ** zouden steeds vervangen moeten worden door $i, maar dit gebeurt maar 1 keer.
$link wordt namelijk de eertse keer al veranderd en heeft dus geen ** meer. Het makkelijkste is om in de loop een nieuwe string de waarde van $link te geven.

code:
1
2
3
4
5
6
7
8
#!/usr/bin/perl
use strict;
my($link,$aantaldagen) = @ARGV;
for (my $i = 1; $i <= $aantaldagen; $i++ ) {
         $newlink = $link;
        $newlink =~ s/\*\*/$i/;
        print "$i\t$newlink\n";
}

[ Voor 3% gewijzigd door Verwijderd op 24-03-2005 11:58 ]


  • pinball
  • Registratie: Oktober 1999
  • Niet online

pinball

Electric Monk

Topicstarter
omg hoe dom :D Heb ik me lekker zitten blindstaren :X
Bedankt voor deze eyeopener _/-\o_

Whenever you find that you are on the side of the majority, it is time to reform.