Jeg prøver igen at spørge efter hjælp til en stump kode.
Jeg har en fil med en masse oplysninger på virtuelle host. filen hedder vhost.ini - i denne fil skal jeg have slettet oplysninger der ligger mellem følgende tegn [user1.domain] og ind til den næste bruger [user2.domain]
Filen indeholder naturligvis flere bruger end userX.domain men hvordan kan jeg slette alt mellem de to bruger.
Hej Nielle, Tak for dit svar, men jeg er lidt i tvivl her for jeg kan ikke få det til at virke :-(
filen der arbejdes med ser således ud: _________________________________________________________________ [bruger1.domain.dk] Automatic Log mailto = bruger@domain.dk CGI Directory = X:/wwwroot/cgi-bin/ CGI Run As = Default Page = index.htm index.html index.stm index.asp index.php
[bruger3.domain.dk] Automatic Log mailto = bruger@domain.dk CGI Directory = X:/wwwroot/cgi-bin/ CGI Run As = Default Page = index.htm index.html index.stm index.asp index.php ___________________________________________________________________ Hvis jeg nu vil slette bruger "2" skal der slettes fra og med [bruger2...] indtil [bruger3....]
Input kommer fra en form..
Det jeg har lavet ser således ud.
$username ( kommer fra en input form ) $vhost = "f:\vhost\vhost.ini"; open (FILE, "$vhost"); @user=<FILE>;
close(FILE);
open (FILE,">$vhost"); foreach $line (@user) { $username =~ s/(.*\[user1\.domain.dk\]).+?(\[user2\.domain.dk\].*)/$1$2/g
Min løsning forudsætter at du har indlæst al teksten fra din fil i en og samme scalar $DinTekst. Det har du ikek. I dit tilfælde kan du derfor ikke bruge regulære udtryk sådan som min løsning forudsætter.
Hvis du vil gøre det på den måde, då kan du f.eks. basser din løsning på flag:
$username ( kommer fra en input form ) $vhost = "f:\vhost\vhost.ini"; open (FILE, "$vhost"); @user=<FILE>;
close(FILE);
DeleteMode = "NEJ";
open (FILE,">$vhost"); foreach $line (@user) { if $line eq "[bruger2.domain.dk]" DeleteMode = "JA";
if $line eq "[bruger3.domain.dk]" DeleteMode = "NEJ";
Jeg har rodet lidt med dit script og får denne fejl meddelse
C:\>perl -w test.pl Bareword found where operator expected at test.pl line 13, near "DeleteMode" (Missing semicolon on previous line?) Bareword found where operator expected at test.pl line 16, near "DeleteMode" (Missing semicolon on previous line?) Bareword found where operator expected at test.pl line 19, near "echo" (Missing semicolon on previous line?) Can't modify constant item in scalar assignment at test.pl line 7, near ""NEJ";"
syntax error at test.pl line 12, near "if $line " Execution of test.pl aborted due to compilation errors.
Det forstår jeg nu ikke, for din kode burde faktisk ikke slette noget som helst:
I dit eksempel (21/06-2005 01:08:59) har du hverken en line som indeholder:
[*.opasiachat.dk]
- eller en som indeholder:
[
- og derfor vil $DeleteMode aldrig ændre værdi væk fra den oprindelige "NEJ".
Bare så der ikke er tvivl. Det at inkludere et '*' betyder ikke at den vil matche noget som f.eks.:
[nielle.opasiachat.dk]
Operatoren eq matcher på den eksakte streng og * fungere ikke som et wildcard i den sammenhæng.
Hvis det nu rent faktisk er sådan at det *er*:
[*.opasiachat.dk]
- som du vil lede efter, så har jeg opdaget en grund til at det fejler. Sagen er nemlig den at hver af dine linjer afsluttes med et linje-skift tegn. Når der skal tjekkes på indholdet af linjen, skal man huske at tage højde for dette.
Jeg vil foreslå en anden fremgangs måde end at læse filens indhold ind i et array. I stedet villejeg læse det ind i en scarlar, manipulere på denne med regulære udtryk og så skrive det hele ud igen:
open (INDATA, "<$host"); while(<INDATA>) { $content .= $_; } close(INDATA);
open (UDDATA, ">$host"); print UDDATA $content; close(UDDATA);
Tilsidst et lille råd. Du skriver direkte til din fil $host. Aldrig, aldrig, aldrig gøre sådan noget. Skriv først til en midlertidig fil og tjek så¨om det gik godt. Først derefter må den oprindelige fil slettes og erstattes med den nye.
Er der en fejl i denne linie.. jeg kan nemmerlig ikke se den.. :-(
Jeg har kommentere en del i scriptet, jeg håber du kan forstå det.
$host = "d:\\vhost.ini"; $hoste = "d:\\vhosts.ini"; # tester om scriptet gemmer i en anden fil.
################################## # denne variabel skal ikke være i scriptet, men får sine oplysninger fra # ($in{'username'}) # Variablen $slet kan også hedde dom1.opasiachat.dk men dette kan jeg # filtrere fra i selve hovede scriptet.
$slet ="dom1";
###################################
open (INDATA, "<$host"); while(<INDATA>) { $content .= $_;
# Jeg har ændret slutningen af denne til .+(\[.*)$/$1$2/g da jeg ikke ved hvilket # subdomæne der kommer efter det der skal slettes. Det kan eks. være dom12.opasiachat.dk
open (FILE,">$hoste"); print FILE "$content"; close (FILE);
Scriptet melder følgende fejl: Syntax err. at test.pl line 36 near "open " Denne fejl får jeg hvis jeg sætter et "#" tegn foran følgende: $content =~ s/^(.*)\[$slet\.opasiachat\.dk].+(\[.*)$/$1$2/g
Har også prøvet med følgende og får samme resultat: $content =~ s/^(.*)\[bruger2\.domain\.dk\].+(\[bruger3\.domain\.dk\].*)$/$1$2/g
Hvis jeg sætter "#" foran linien får jeg ingen fejl og scriptet gemmer oplysningerne i en ny ( se kommentar i scriptet ) , men linien slettes naturligvis ikke så.
Jeg er ikke speciel god til PERL så derfor har jeg det godt med at bruge ### :-) Så ved jeg nogenlunde hvad der sker..
Kan du se fejlen ? Hvis det er ved at blive for meget skriveri her er jeg at fange på msn@npnet.dk
Ser din indputfil virkelig ud som det du har postet i 21/06-2005 01:08:59? Jeg spørger fordi at din kode fra 21/06-2005 11:38:29 ser ud dom om at der står noget helt andet i filen.
Det regulære udtryk jeg har angivet basere sig på at det ser ud som i 21/06-2005 01:08:59, og der er ingen grund til at antage at den skulle virke for noget som *ikke* ser sådan ud.
Hej, En brugers oplysninger starter i vhost filen med eks. [bruger1.opasiachat.dk] ... .... ..... ......
[bruger2.opasiachat.dk] ... .... ..... ......
[bruger3.opasiachat.dk] ... .... ..... ......
osv. osv
Opasiachat.dk] er altid det samme, dette ændre sig ikke. Oplysninger under eks. [bruger3.opasiachat.dk] er de samme med undtagelse af:
Automatic Log mailto = bruger@opasiachat.dk -
I dit eksempel har jeg naturligvis prøvet at skifte domain.dk ud med opasiachat.dk - uden held.
Når en bruger får en hjemmeside konto oprettes personen i vhost filen ved at skrive til filen på denne måde: ## open filehandle, ">>$vhostfile"; print filehandle "$vhost \n"; print filehandle "Automatic Log mailto = $username\@opasiachat.dk \n"; print filehandle "CGI Directory = X:/wwwroot/cgi-bin/ \n" print filehandle "CGI Run AS = \n"; print filehandle "Default Page = $default_page \n";
close filehandle; Tænkte det måske kunne hjælpe at oplyse dette :-)
Der er ftp adgang til scriptet hvor vhost filen også ligger. Der er kun et par filer så der sker vist ikke det vilde ved at smide login oplysningerne her..
ftp : opasiachat.dk kode 1234
Det ville være meget lækkert hvis jeg kunne få skidtet til at virke. Jeg er ved at få grå hår af det *grrr* - flere end jeg har i forvejen, men det er pga alderen *LOL*
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.