/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Omdirigering af en glob til STDIN
Fra : Nezar Nielsen


Dato : 02-01-01 15:23

Hej Gruppe,

Jeg er kommet lidt i tvivl mht. følgende...

Jeg sidder og piller med en webserver lavet med HTTP::Daemon modulet, og
alting virker i og for sig også fint, men jeg vil gerne kunne lave diverse
CGI operationer med de filer serveren serverer(uden at starte andre
processer). Dertil bruger jeg som sædvanligt CGI.pm, men CGI.pm forventer at
få sit input fra HTTP-POST operationer i *STDIN.
Når man bruger HTTP::Daemon modulet får man altså den slags input i selve
client-objektet (i mit eksempel: $c), derfor vil jeg gerne om-dirigere $c
til STDIN, sådan at når CGI.pm læser fra STDIN, så er det i virkeligheden $c
den læser fra.

Og her er så mit dilemma:
Er der noget galt i at sige *STDIN=$c; ? Det ser ud til at virke, men jeg
ved ikke om der kan opstå problemer med det?

Eller skal jeg "åbne" STDIN med $c som parameter, som beskrevet i perldoc -f
open - hvilket formentligt vil resultere i noget i stil med:

open(OLDIN,"<&STDIN");
open(STDIN,"<&$c");

select(STDIN); $|=1; #unbuffer STDIN
select(STDOUT); #output går stadig til STDOUT.


$cgi=new CGI;

close(STDIN);
open(STDIN,"<&OLDIN");


Håber der er nogen der kan hjælpe.. :)

--
Mvh. Nezar Nielsen
http://fez.dk/




 
 
Sune Kirkeby (12-01-2001)
Kommentar
Fra : Sune Kirkeby


Dato : 12-01-01 23:46


[ "Nezar Nielsen" <tumpen@fez.dk> ]

> Jeg sidder og piller med en webserver lavet med HTTP::Daemon
> modulet, og alting virker i og for sig også fint, men jeg vil gerne
> kunne lave diverse CGI operationer med de filer serveren
> serverer(uden at starte andre processer). Dertil bruger jeg som
> sædvanligt CGI.pm, men CGI.pm forventer at få sit input fra
> HTTP-POST operationer i *STDIN.

> Når man bruger HTTP::Daemon modulet får man altså den slags input i
> selve client-objektet (i mit eksempel: $c), derfor vil jeg gerne
> om-dirigere $c til STDIN, sådan at når CGI.pm læser fra STDIN, så er
> det i virkeligheden $c den læser fra.

For at citere CGI-modulets dokumentationen,

CREATING A NEW QUERY OBJECT FROM AN INPUT FILE

$query = new CGI(INPUTFILE);

If you provide a file handle to the new() method, it will read
parameters from the file (or STDIN, or whatever).

og lidt senere,

Perl purists will be pleased to know that this syntax accepts
references to file handles, or even references to filehandle
globs,

Så du kan altså bare give $c videre til CGI-konstruktøren.

> Og her er så mit dilemma: Er der noget galt i at sige *STDIN=$c; ?
> Det ser ud til at virke, men jeg ved ikke om der kan opstå problemer
> med det?

> Eller skal jeg "åbne" STDIN med $c som parameter, som beskrevet i
> perldoc -f open [...]

Begge ting burde være ganske lovlige, om end ikke så pæne.

> Håber der er nogen der kan hjælpe.. :)

Håber det hjalp.

--
Sune Kirkeby | "Imagine, if you will, that there were no
http://mel.interspace.dk/~sune/ | such thing as a hypothetical
situation..."

Nezar Nielsen (18-01-2001)
Kommentar
Fra : Nezar Nielsen


Dato : 18-01-01 20:25

"Sune Kirkeby" <sune@interspace.dk> wrote in message
news:87vgrkbd96.fsf@sune.interspace.dk...
>
> [ "Nezar Nielsen" <tumpen@fez.dk> ]
>
> > Jeg sidder og piller med en webserver lavet med HTTP::Daemon
> > modulet, og alting virker i og for sig også fint, men jeg vil gerne
> > kunne lave diverse CGI operationer med de filer serveren
> > serverer(uden at starte andre processer). Dertil bruger jeg som
> > sædvanligt CGI.pm, men CGI.pm forventer at få sit input fra
> > HTTP-POST operationer i *STDIN.
>
> > Når man bruger HTTP::Daemon modulet får man altså den slags input i
> > selve client-objektet (i mit eksempel: $c), derfor vil jeg gerne
> > om-dirigere $c til STDIN, sådan at når CGI.pm læser fra STDIN, så er
> > det i virkeligheden $c den læser fra.
>
> For at citere CGI-modulets dokumentationen,
....
>
> If you provide a file handle to the new() method, it will read
> parameters from the file (or STDIN, or whatever).
>
....
> Så du kan altså bare give $c videre til CGI-konstruktøren.
>

Hej Sune,

Tak for svaret,

Jeg fandt ud af det samme efter lidt nærlæsning...

Senere fik jeg et andet problem: desværre får man med HTTP::Daemon ikke
altid alt input i $c, da den læser headerne ind selv og af og til læser lidt
for langt. Når det sker, gemmer modulet det der er læst for langt i en
buffer, så jeg endte med at måtte åbne en midlertidig fil, skrive bufferen
til den, derefter skrive alt indholdet fra STDIN til den, og så give CGI
handlet til den.. :/

--
Mvh. Nezar Nielsen
http://fez.dk/




Søg
Reklame
Statistik
Spørgsmål : 177547
Tips : 31968
Nyheder : 719565
Indlæg : 6408797
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste