Toon posts:

[perl] hash en var passen naar sub

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik ben dus bezig met een mini-template parser, gewoon voor een scriptje wat ik zelf gebruik.

ik heb de volgende sub gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub dotemplate {

open(FILE,$_[0]) || &cgierror("kan $filename niet openen!");
@filearray = <FILE>;
close(FILE);

foreach $line(@filearray) {
  while ( ($key, $value) = each %$_[1]) {
    $gefixed .= "debug: $key-$value";
    $line =~ s/\#\%$key\%\#/$value/gi;
    $gefixed .= $line;
  }  
}

return $gefixed;
}

en die sub roep ik zo aan:
code:
1
2
3
4
5
6
%verplaats = (
"dit" => "dat",
"dat" => "dit"
);
$var = &foxlib::dotemplate("templates/test.thtm", \%verplaats);
print $var;

het zit dus in deze regel:
while ( ($key, $value) = each %$_[1]) {
dat werkt niet

op perldoc.com vond ik dit voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
    @common = inter( \%foo, \%bar, \%joe );
    sub inter {
    my ($k, $href, %seen); # locals
    foreach $href (@_) {
        while ( $k = each %$href ) {
        $seen{$k}++;
        }
    }
    return grep { $seen{$_} == @_ } keys %seen;
    }

als ik dit uitvoer geeft ie dus een 500 en ik kan nix in de logs vinden.
wat doe ik vout??? ik snap het effe niet meer

  • Grum
  • Registratie: Juni 2001
  • Niet online
ik neem aan dat de 'pen' in je source gewoon 'open' is en dat de missende } in je 'dotemplate' functie der normaal wel staat ? :D

Verwijderd

Topicstarter
Op vrijdag 21 juni 2002 17:51 schreef Grum het volgende:
ik neem aan dat de 'pen' in je source gewoon 'open' is en dat de missende } in je 'dotemplate' functie der normaal wel staat ? :D
jah ik edit et wel effe

  • tomato
  • Registratie: November 1999
  • Niet online
Het gaat om de %$_[1]
Als je dit schrijft als %{$_[1]} is je probleem waarschijnlijk opgelost.

Verder een opmerking over je manier van variabelen parsen. Je loopt langs iedere variabele en gaat daarmee steeds een global search and replace uitvoeren. Ik zou hiervoor de /e modifier gebruiken zodat je die search en replace maar een keer hoeft te doen:
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
33
34
35
36
37
38
use strict;


sub parse {

    # Replace all occurences of {var} with appropriate value

    my $content = shift;
    my $keys = shift;

    $content =~
        s/
            { ([^}]+) }
        /
            $keys->{$1}
                 if defined $keys->{$1}
        /xeg;

    $content;

}


# Try this with sample data

my $data = <DATA>;

my %values = (
    titel=>'TITEL',
    dingen=>'DINGEN',
    doen=>'DOEN'
);

print parse($data, \%values);


__DATA__
hier een {titel} en meer {ja} leuke {dingen} hier die het {doen}.

Voor het gemak heb ik even voorbeeld input in een __DATA__ sectie gezet en variabelen aangegeven met { en }.