Perl-variabel -> Visas på HTML-sida. *Löst*
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
> Jodå:...
Du är envis... 
Igen, nej, det är INTE samma sak.
Det som körs på klienten (t.ex i Javascript eller VBscript) kan göra vad den
vill med det som finns på skärmen, ungefär så som du visade.
Det som körs på servern kan *INTE* göra liknande uppdateringar.
Det som körs på servern (t.ex i perl, PHP, Java eller C) kan inte längre
komma åt klienten efter att sessionen har stängts.
Du blandar ihop "server-side" och "client-side". I och för sig väldigt
enkelt att blanda ihop det, innan man har sett "ljuset" och förstått
hur en http-session fungerar.
HTTP är state-less. Efter att en sida har skrivits ut bryts kontakten och det
finns inte längre någon "channel" att skriva något mer på. För att det ska
hända något mer måste *klienten* ta nästa kontakt.
Dina JavaScript exempel fungerar helt OK, men de har inget med server-
side perl script att göra, vilket är det du har talat om....
Du måste altså (precis som citaten du hade hittat någon annanstans)
skriva ut nya sidor där du har lagt in dina nya värden.
Mitt tidigare svar kvarstår.


Igen, nej, det är INTE samma sak.
Det som körs på klienten (t.ex i Javascript eller VBscript) kan göra vad den
vill med det som finns på skärmen, ungefär så som du visade.
Det som körs på servern kan *INTE* göra liknande uppdateringar.
Det som körs på servern (t.ex i perl, PHP, Java eller C) kan inte längre
komma åt klienten efter att sessionen har stängts.
Du blandar ihop "server-side" och "client-side". I och för sig väldigt
enkelt att blanda ihop det, innan man har sett "ljuset" och förstått
hur en http-session fungerar.
HTTP är state-less. Efter att en sida har skrivits ut bryts kontakten och det
finns inte längre någon "channel" att skriva något mer på. För att det ska
hända något mer måste *klienten* ta nästa kontakt.
Dina JavaScript exempel fungerar helt OK, men de har inget med server-
side perl script att göra, vilket är det du har talat om....
Du måste altså (precis som citaten du hade hittat någon annanstans)
skriva ut nya sidor där du har lagt in dina nya värden.
Mitt tidigare svar kvarstår.
Nej, det hjälper inte.
Klienten kan inte veta när det nya värdet finns färdigt på servern.
Man *kan* göra en frame eller layer och javasript som som
accessar en speciell URL, viken ger html kod tillbaka som laddas
i ett dolt layer eller IFRAME. Seden kan javascripten läsa denna
dolda frame och plocka fram de nya värderna och skriva dom
till den synliga "bilden". Jäkligt snårigt blir det...
Ajax är en ny teknik som försöker lösa detta problem med
"interaktiva web applikationer". Se : http://en.wikipedia.org/wiki/AJAX
Det absolut enklaste är att helt enkelt skriva om sidan med de
nya värderna...
Klienten kan inte veta när det nya värdet finns färdigt på servern.
Man *kan* göra en frame eller layer och javasript som som
accessar en speciell URL, viken ger html kod tillbaka som laddas
i ett dolt layer eller IFRAME. Seden kan javascripten läsa denna
dolda frame och plocka fram de nya värderna och skriva dom
till den synliga "bilden". Jäkligt snårigt blir det...
Ajax är en ny teknik som försöker lösa detta problem med
"interaktiva web applikationer". Se : http://en.wikipedia.org/wiki/AJAX
Det absolut enklaste är att helt enkelt skriva om sidan med de
nya värderna...
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
> Du är envis...
och det ska du prata om..
Sant, jag är mycket envis tills någon förklarar och jag förstår varför jag har fel.
Nu förstår jag hur du menar med att det inte går.
> Du blandar ihop "server-side" och "client-side".
Nja, det hänger jag med på. Däremot visste jag inte detta:
> För att det ska hända något mer måste *klienten* ta nästa kontakt.
> Det absolut enklaste är att helt enkelt skriva om sidan med de
nya värderna...
Ok. Om jag beskriver hela kedjan från början:
*Man knappar in sajt.se i webläsaren och kommer till index.html med länkar.
*Där finns en länk som går till ett perl-script (script.cgi). Användaren klickar på länken.
*Perl-scriptet startas. och öppnar admin.html som alltså är en helt egen HTML-fil. (Koden för detta finns i ett tidigare inlägg.)
*På denna HTML-sida finns ett formulär med textinmatningsfält och kryssrutor. Användaren skriver något och kryssar i några rutor. När man trycker på 'Submit'-knappen så skickas (eller hur man ska säga) det inmatade till perl-scriptet. En kodsnutt förklarar detta bättre:
admin.html: (Exempel-kod)
Det inmatade datat läses i perl-scriptet med:
read(STDIN, $minnet, $ENV{'CONTENT_LENGTH'});
*Efter att perl-scriptet har behandlat datan så behöver jag alltså skriva om HTML-sidan med de nya värdena.
Hur man laddar om HTML-sidan med antingen perl, HTML eller javascript är inga problem.
Men: Hur får jag innehållet i perl-scriptets variabler att visas på HTML-sidan?
Samma fråga som i mitt första inlägg alltså.


Sant, jag är mycket envis tills någon förklarar och jag förstår varför jag har fel.
Nu förstår jag hur du menar med att det inte går.
> Du blandar ihop "server-side" och "client-side".
Nja, det hänger jag med på. Däremot visste jag inte detta:
> För att det ska hända något mer måste *klienten* ta nästa kontakt.
> Det absolut enklaste är att helt enkelt skriva om sidan med de
nya värderna...
Ok. Om jag beskriver hela kedjan från början:
*Man knappar in sajt.se i webläsaren och kommer till index.html med länkar.
*Där finns en länk som går till ett perl-script (script.cgi). Användaren klickar på länken.
*Perl-scriptet startas. och öppnar admin.html som alltså är en helt egen HTML-fil. (Koden för detta finns i ett tidigare inlägg.)
*På denna HTML-sida finns ett formulär med textinmatningsfält och kryssrutor. Användaren skriver något och kryssar i några rutor. När man trycker på 'Submit'-knappen så skickas (eller hur man ska säga) det inmatade till perl-scriptet. En kodsnutt förklarar detta bättre:
admin.html: (Exempel-kod)
Kod: Markera allt
<script language=javascript>
<!--
function validera()
{
var myvar;
myvar=document.forms[0].bak.value;
if(myvar.length>0)
{
document.forms[0].submit();
}
else
{
alert('Du måste ju fylla i något');
}
}
//-->
</script>
<body>
<form name="form1" method="post" action=script.cgi>
<p>Skriv något:
<input name="data" type="text" id="data" value="----" size="4" maxlength="4">
<input type="button" name="Submit" onClick=validera() value="Ok">
</p>
</form>
read(STDIN, $minnet, $ENV{'CONTENT_LENGTH'});
*Efter att perl-scriptet har behandlat datan så behöver jag alltså skriva om HTML-sidan med de nya värdena.
Hur man laddar om HTML-sidan med antingen perl, HTML eller javascript är inga problem.
Men: Hur får jag innehållet i perl-scriptets variabler att visas på HTML-sidan?
Samma fråga som i mitt första inlägg alltså.

> Efter att perl-scriptet har behandlat datan så behöver jag alltså skriva om HTML-sidan med de nya värdena.
Just det !
Du kan alltså inte *enbart* skicka tillbaka värden, eftersom browsern nu
väntar på en hel http/html session med <HTML>, <BODY"> o.s.v.
> Hur man laddar om HTML-sidan med antingen perl, HTML eller javascript är inga problem.
Jag tror att jag förstår vad du menar, men det är lite blandning av äpplen och päron här...
Både perl och javascript använder ju HTML för själva kodningen av sidan.
> Hur får jag innehållet i perl-scriptets variabler att visas på HTML-sidan?
Genom att perl scriptet ändrar på lämpliga ställen i HTML koden
*innan* den skickas tillbaka till browsern. Använd de vanliga
stränghanterings funktionerna.
Jag saknar fortfarande steget där din HTML fil skickas till browsern.
Du säger bara att du "öppnar" filen i ditt perl script. När och hur skickas
den till browsern ?
För övrigt är det en vanlig POST av fomuläret.
Är "script.cgi" alltså ditt perl script ?
Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
script ?
Använder du något speciellt "HTML-verktyg" i ditt perl-script ?
Just det !
Du kan alltså inte *enbart* skicka tillbaka värden, eftersom browsern nu
väntar på en hel http/html session med <HTML>, <BODY"> o.s.v.
> Hur man laddar om HTML-sidan med antingen perl, HTML eller javascript är inga problem.
Jag tror att jag förstår vad du menar, men det är lite blandning av äpplen och päron här...
Både perl och javascript använder ju HTML för själva kodningen av sidan.
> Hur får jag innehållet i perl-scriptets variabler att visas på HTML-sidan?
Genom att perl scriptet ändrar på lämpliga ställen i HTML koden
*innan* den skickas tillbaka till browsern. Använd de vanliga
stränghanterings funktionerna.
Jag saknar fortfarande steget där din HTML fil skickas till browsern.
Du säger bara att du "öppnar" filen i ditt perl script. När och hur skickas
den till browsern ?
För övrigt är det en vanlig POST av fomuläret.
Är "script.cgi" alltså ditt perl script ?
Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
script ?
Använder du något speciellt "HTML-verktyg" i ditt perl-script ?
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Ok, då förstår jag.
> Jag tror att jag förstår vad du menar, men det är lite blandning av äpplen och päron här...
> Både perl och javascript använder ju HTML för själva kodningen av sidan.
Sant. Jag ville bara förtydliga att jag vet hur man gör för att sidan ska skrivas om. (Dvs, visas igen.)
> Jag saknar fortfarande steget där din HTML fil skickas till browsern.
> Du säger bara att du "öppnar" filen i ditt perl script. När och hur skickas den till browsern ?
Det sker precis i början av perl-scriptet. Hela koden för att skicka HTML-filen till browsern ser ut såhär:
Denna rutin startas för tillfället på raden efter sub-rutinen med &visa_sida
Jag tror jag förstår nu:
Raden print $ml skriver ju ut HTML-sidan till browsern. Enligt tidigare resonemang vet jag nu att jag måste ändra HTML-koden *innan* raden print $ml.
Alltså ska jag stoppa in kod som ändrar koden mellan close(RVF); och print $ml. Det borde väl bli rätt?
edit: Oj, jag glömde några frågor:
> För övrigt är det en vanlig POST av fomuläret.
Jepp.
> Är "script.cgi" alltså ditt perl script ?
Japp.
Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
script ?
Precis! (Om jag inte missförstått frågan, men du kanske förstår av min kod ovan.)
Använder du något speciellt "HTML-verktyg" i ditt perl-script ?
Nop.

> Jag tror att jag förstår vad du menar, men det är lite blandning av äpplen och päron här...
> Både perl och javascript använder ju HTML för själva kodningen av sidan.
Sant. Jag ville bara förtydliga att jag vet hur man gör för att sidan ska skrivas om. (Dvs, visas igen.)

> Jag saknar fortfarande steget där din HTML fil skickas till browsern.
> Du säger bara att du "öppnar" filen i ditt perl script. När och hur skickas den till browsern ?
Det sker precis i början av perl-scriptet. Hela koden för att skicka HTML-filen till browsern ser ut såhär:
Kod: Markera allt
sub visa_sida
{
$fsize1 = (-s "/sökväg/test/test.html");
open (RVF, "/sökväg/test/test.html");
read(RVF,$ml,$fsize1);
close (RVF);
print $ml
}
Jag tror jag förstår nu:
Raden print $ml skriver ju ut HTML-sidan till browsern. Enligt tidigare resonemang vet jag nu att jag måste ändra HTML-koden *innan* raden print $ml.
Alltså ska jag stoppa in kod som ändrar koden mellan close(RVF); och print $ml. Det borde väl bli rätt?
edit: Oj, jag glömde några frågor:
> För övrigt är det en vanlig POST av fomuläret.
Jepp.
> Är "script.cgi" alltså ditt perl script ?
Japp.
Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
script ?
Precis! (Om jag inte missförstått frågan, men du kanske förstår av min kod ovan.)
Använder du något speciellt "HTML-verktyg" i ditt perl-script ?
Nop.

> print $ml
Men va f....
*Den* delen var väl aldrig med i dina tidigare inlägg !!??
> Alltså ska jag stoppa in kod som ändrar koden mellan close(RVF); och print $ml . Det borde väl bli rätt?
Japp. Som det ser ut *NU* (där du alltså har tillgång till hela HTML filen
i $ml), så är det en baggis att ändra variablen med något av perl's
sträng substituerings kommando. Jag har det inte i huvudet, men detta
är ju perl's starka sida (stränghantering) så det finns säkert något bra.
Lägg bara ditt något unikt i HTML filen som subst kommandot kan ha
som "target".
Något i stil med :
$ml =~ s/__myvar__/$new_value/g;
Där "__myvar__" är placeholdern i HTML filen och "$new_value" är ditt nya värde.
Kolla perl documentationen...
>> Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
>> tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
>> script ?
>
> Precis! (Om jag inte missförstått frågan, men du kanske förstår av min
> kod ovan.)
Ser inte ut så nu, du har ju en extra "print" för att skriva ut det...
Har du inte med något extra i början på scriptet som *öppnar* en
väg tillbaka till browsern ? Eller är det redan gjort när din egen kod startar ?
print måste ju så att säga "veta" vart den ska skriva...
Men va f....

*Den* delen var väl aldrig med i dina tidigare inlägg !!??
> Alltså ska jag stoppa in kod som ändrar koden mellan close(RVF); och print $ml . Det borde väl bli rätt?
Japp. Som det ser ut *NU* (där du alltså har tillgång till hela HTML filen
i $ml), så är det en baggis att ändra variablen med något av perl's
sträng substituerings kommando. Jag har det inte i huvudet, men detta
är ju perl's starka sida (stränghantering) så det finns säkert något bra.
Lägg bara ditt något unikt i HTML filen som subst kommandot kan ha
som "target".
Något i stil med :
$ml =~ s/__myvar__/$new_value/g;
Där "__myvar__" är placeholdern i HTML filen och "$new_value" är ditt nya värde.
Kolla perl documentationen...
>> Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
>> tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
>> script ?
>
> Precis! (Om jag inte missförstått frågan, men du kanske förstår av min
> kod ovan.)
Ser inte ut så nu, du har ju en extra "print" för att skriva ut det...
Har du inte med något extra i början på scriptet som *öppnar* en
väg tillbaka till browsern ? Eller är det redan gjort när din egen kod startar ?
print måste ju så att säga "veta" vart den ska skriva...
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
>> print $ml
> Men va f....
> *Den* delen var väl aldrig med i dina tidigare inlägg !!??
Nej, då skrev jag bara raderna som hämtar HTML-filen för behandling i perl-scriptet. Print-raden är förstås nödvändig, men tidigare visste jag inte att samma rad även kunde användas för att i princip lösa mitt problem.
> Har du inte med något extra i början på scriptet som *öppnar* en väg tillbaka
> till browsern ? Eller är det redan gjort när din egen kod startar ?
> print måste ju så att säga "veta" vart den ska skriva...
Jag tänkte prova att låta scriptet leta upp markeringar i HTML-filen och ersätta med rätt info. Vet inte om det kommer fungera än.
T.ex om en markering är !!kod!! så skriver jag t.ex såhär i HTML-filen:
Koden är !!kod!! .
Sedan ersätter scriptet !!kod!! med innehållet i $kod när sidan skrivs ut (med print $ml).
Det borde kanske räcka?
edit: Ja, det var ju förresten så du skrev.
Men tror du att jag behöver öppna en väg tillbaka? Räcker det inte att läsa in html-koden med sub-rutinen och bara printa ut innehåller i webläsaren?
> Men va f....
> *Den* delen var väl aldrig med i dina tidigare inlägg !!??
Nej, då skrev jag bara raderna som hämtar HTML-filen för behandling i perl-scriptet. Print-raden är förstås nödvändig, men tidigare visste jag inte att samma rad även kunde användas för att i princip lösa mitt problem.
> Har du inte med något extra i början på scriptet som *öppnar* en väg tillbaka
> till browsern ? Eller är det redan gjort när din egen kod startar ?
> print måste ju så att säga "veta" vart den ska skriva...
Jag tänkte prova att låta scriptet leta upp markeringar i HTML-filen och ersätta med rätt info. Vet inte om det kommer fungera än.
T.ex om en markering är !!kod!! så skriver jag t.ex såhär i HTML-filen:
Koden är !!kod!! .
Sedan ersätter scriptet !!kod!! med innehållet i $kod när sidan skrivs ut (med print $ml).
Det borde kanske räcka?
edit: Ja, det var ju förresten så du skrev.

Men tror du att jag behöver öppna en väg tillbaka? Räcker det inte att läsa in html-koden med sub-rutinen och bara printa ut innehåller i webläsaren?
> Nej, då skrev jag bara raderna som hämtar HTML-filen för behandling i perl-scriptet.
Och jag frågade två eller tre gånger efter steget där HTML koden
skickades till browsern. Det kom till slut...
> Sedan ersätter scriptet !!kod!! med innehållet i $kod när sidan skrivs ut (med print $ml).
Inte *när* sidan skrivs ut, utan *innan*...
Men jo, det var så jag skrev. Och hade skrivit från första början om
bara din "print $ml" hade varit med från början...
Prova med :
så får vi se vad som händer...
> Men tror du att jag behöver öppna en väg tillbaka? Räcker det inte att
> läsa in html-koden med sub-rutinen och bara printa ut innehåller i
> webläsaren?
Alltså, för att skriva något tillbaka till browsern så måste det finnas en
öppnad nätverkslänk. Antingen öppnas den av webservern *innan*
perlscriptet anropas (verkar så i detta fall) eller så får man göra det själv...
Och jag frågade två eller tre gånger efter steget där HTML koden
skickades till browsern. Det kom till slut...

> Sedan ersätter scriptet !!kod!! med innehållet i $kod när sidan skrivs ut (med print $ml).
Inte *när* sidan skrivs ut, utan *innan*...
Men jo, det var så jag skrev. Och hade skrivit från första början om
bara din "print $ml" hade varit med från början...

Prova med :
Kod: Markera allt
open (RVF, "/sökväg/test/test.html");
read(RVF,$ml,$fsize1);
close (RVF);
$ml =~ s/!!kod!!/$kod/g;
print $ml;
> Men tror du att jag behöver öppna en väg tillbaka? Räcker det inte att
> läsa in html-koden med sub-rutinen och bara printa ut innehåller i
> webläsaren?
Alltså, för att skriva något tillbaka till browsern så måste det finnas en
öppnad nätverkslänk. Antingen öppnas den av webservern *innan*
perlscriptet anropas (verkar så i detta fall) eller så får man göra det själv...
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Det fungerade!
Vad kul det är när man lär sig något nytt!
> Och jag frågade två eller tre gånger efter steget där HTML koden
> skickades till browsern. Det kom till slut...
Jo..
I ett annat fall kunde jag visat koden från början till slut. Men det var lite knepigt att välja ut rätt delar att visa ur denna kod. Dels eftersom den är så lång och dels för att merparten är hemlig. Hela sidan ska användas till bl.a administration av mina sajter och ska även fungera som filter för mail och gästböcker. Allt är i princip klart. Det var bara denna lilla detalj som fattades.
> Alltså, för att skriva något tillbaka till browsern så måste det finnas en
> öppnad nätverkslänk. Antingen öppnas den av webservern *innan*
> perlscriptet anropas (verkar så i detta fall) eller så får man göra det själv...
Jo, den måste nog öppnas av webservern innan, för jag har inte gjort det.
Men nu fungerar det som sagt.
Tack för hjälpen!
Vad kul det är när man lär sig något nytt!

> Och jag frågade två eller tre gånger efter steget där HTML koden
> skickades till browsern. Det kom till slut...
Jo..

> Alltså, för att skriva något tillbaka till browsern så måste det finnas en
> öppnad nätverkslänk. Antingen öppnas den av webservern *innan*
> perlscriptet anropas (verkar så i detta fall) eller så får man göra det själv...
Jo, den måste nog öppnas av webservern innan, för jag har inte gjort det.

Men nu fungerar det som sagt.
Tack för hjälpen!

> Jo, den måste nog öppnas av webservern innan, för jag har inte gjort det.
OK, det där beror lite på hur web-servern hanterar det.
På vissa plattformar får man en "handle" som man måste göra
"open" på innan man skriver till den...
Kul att det fungerar i alla fall...
> Men det var lite knepigt att välja ut rätt delar att visa ur denna kod.
> Dels eftersom den är så lång och dels för att merparten är hemlig.
I ett sådant fall är det enklast att göra ett helt separat "test-case" som
enbart testar just denna funktion. Då kan man ju även posta hela
koden...
OK, det där beror lite på hur web-servern hanterar det.
På vissa plattformar får man en "handle" som man måste göra
"open" på innan man skriver till den...
Kul att det fungerar i alla fall...
> Men det var lite knepigt att välja ut rätt delar att visa ur denna kod.
> Dels eftersom den är så lång och dels för att merparten är hemlig.
I ett sådant fall är det enklast att göra ett helt separat "test-case" som
enbart testar just denna funktion. Då kan man ju även posta hela
koden...