Toon posts:

[perl] hoe doe ik dit het beste?

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb dus de volgende mini-template parser sub geschreven,
maar als ik die debug regel dus uncomment en ik stuur als hash

"naam" => "waarde"

dan wordt er dus geprint:
naam -
naam - waarde

dus hij gaat als het ware dubbel door die loop heen?
dit is echt uber ranzige code, wie geeft mij een duwtje in de goede (cleane) richting?
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;
}

owjah, en hoe controleer ik of een hash leeg is? want als ik dan geen hash met waarden meegeef om te replacen kan hij natuurlijk die hele loop overslaan sgeelt weer cpu time

  • Juup
  • Registratie: Februari 2000
  • Niet online
Wat probeer je eigenlijk te doen? En praat eens wat helderder.

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


Verwijderd

Topicstarter
pfff nou speciaal voor jou dan:
code:
1
2
3
4
%verplaats = ( "scriptdir" => $ENV{'SCRIPT_NAME'} );

$var = &foxlib::dotemplate("templates/test.thtm", \%verplaats);
print $var;

met doe code opentie dus test.thtm en verplaatst in dat bestand #%scriptdir%# met de naam van het script enzo.

maar als ik nu in de code van die sub, de # weghaal, en vervolgens print ik $gefixed, dan zie ik dus met de code hierboven dit: debug: scriptdir- debug: scriptdir-/cgi-bin/photo.cgi

dat moet dus betekenen dat ie 2x door de loop gaat ofzow
dit kan gewoon effiecienter maar ik weet niet precies hoe

  • Juup
  • Registratie: Februari 2000
  • Niet online
Okee aangezien je nog steeds niet precies verteld wat jouw code zou moeten doen ga ik het wat algemener maken.

Stel je wilt een textfile inlezen en een aantal strings vervangen door een aantal andere strings.

Dat doe je zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $textFileContent;
my %replaceText = ( '#%scriptdir%#' => '/home/focboy',
              'jan'      => 'piet',
              'Winner'    => 'Brazil'
            );
if (open (FH, "textfile.txt"))
{
  while (<FH>)
  {
    my $currentLine = $_;
    foreach my $key (keys %replaceText)
    {
    $currentLine =~ s/$key/$replaceText{$key}/g;
    }
    $textFileContent .= $currentLine;
  }
  close (FH);
}
print $textFileContent;

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


Verwijderd

Topicstarter
sorry maar de uitleg die ik geef + de code die je zo door kan lezen lijkt me dat je het wel begrijpt.

tnx voor de code,
das precies wat ik nodig hep

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Misschien eens slim om te kijken naar HTML::TEMPLATE module? Doet namelijk precies wat jij wil en ook mogelijkheden voor loops en andere toeters en bellen.

  • tomato
  • Registratie: November 1999
  • Niet online
Waarom heb je hier eigenlijk nooit meer naar gekeken?
Pagina: 1