|
|||||||||||||||||||||||||||
Hej ssluggere.
Rene Seindal var meget frisk til at regne ud hvad der foregik sidste
gang med mit perl reverse spørgsmål. Denne gang er det alvor;
Det andet var bare nysgerrighed for sjov.
Man forestiller sig at man har en serie link-macroer som denne:
$link{'L1'}="http://%s/%s";
og man ønsker at indsætte de to '%s'er i form af variabler der
interpoleres ud fra en angivelse af deres navne i en streng "L1:$r1:$r2".
Fortolkes som:
Anvend $link{'L1'} og indsæt $r1 og $r2 som er kendte og definerede.
Det virker fint når jeg isolerer mekanikken i et lille test program
som dette. Det kører og giver
http://goda/darvs
--8<--
#!/usr/bin/perl
$\="\n";
my ($r1,$r2)=("goda","darvs");
my $www="L1:$r1:$r2";
$link{'L1'}="http://%s/%s";
($m,@p)=split(/:/,$www);
sslug@sslug("\$r1","\$r2");
sslug@sslug(eval,@p);
$form=sprintf($link{$m},@p);
print $form;
--8<--
Mit problem er at $r1 og $r2 ikke interpoleres i det rigtige program,
svarende til at indkoble den første kommentar herover.
-->@p=("\$r1","\$r2");
Min klamhuggerløsning bestod i at indkoble den anden kommentar for at
gennemtvinge interpolationen
-->@p=map(eval,@p);
Det er meget ulykkeligt fordi eval interpolerer OG fortolker som en
perlsætning.
Det kører egentligt korrekt men giver advarslen
Warning: Use of "-c" without parens is ambiguous at (eval 19) line 1,
<STDIN> chunk 347.
fordi $r1 på et tidspunkt er bla.a 'www.uni-c.dk'
I det rigtige program er de eneste forskelle at
1) $link hentes som første element i en liste
$link=$link{$m}->[0];
men det er jo nærmest ligemeget.
2) $www bliver læst fra en fil.
(Vil det svare til at sætte
$www='L1:$r1:$r2';
i stedet for
$www="L1:$r1:$r2";
??? Det er hvad jeg tror der sker men hvordan klarer man det?)
til reference her er koden fra det rigtige program
my ($m,@p)=split(/:/,$www);
my $link=$link{$m}->[0];
$link=sprintf($link,map(eval($_),@p));
$www blev læst med
while (<>){
next if (/^\#/ or /^\s*$/);
/^([A-Z0-9]+)/ && (push(@$1,[split]));
}
det er lidt snørklet men et af felterne ender altså i $www.
/bv
PS: Til Rene Seinddal: Har vi ikke gået på samme Gymnasium i Søborg?
|
||||||||||||||
|
||||||||||||||