Kommandoen kører fint. Har man bedt den om at slette f.eks. "Testoverskrift" går den ind og finder linien, hvor Detteerenoverskrift.shtml (Filename) og sletter linien.
Nu har jeg imidlertid flere filer, der alle skal have slettet den linie, hvor teksten Detteerenoverskrift.shtml findes.
Derfor har jeg lavet en variant:
open(GW2,"$BaseDir/$DataFile2"); @lines2 = <GW2>; close GW2;
open (GB2,">$BaseDir/$DataFile2"); foreach $line2 (@lines2) { chop $line2; @TempData2 = split (/\t/, $line2);
if ($TempData2[1] ne "$in{'Filename'}") { print GB2 "$line2\n"; } } close GB2;
Lige et opklarende spørgsmål. I den nederste har du også |-er til at adskille felter. Og dem splitter du da vist ikke på. Har det noget med sagen at gøre?
(det der med patternmatching i stedet for ne er selvfølgelig kun hvis du rent faktisk ikke skriver det fulde navn i feltet: |nyheder/Detteerenoverskrift.shtml )
Hmm... det duede ikke. Hverken den ene eller den anden måde. Det sletter blot alle linier i filen, og det er jo ikke ligefrem meningen. Jeg specificerede endda for den, hvad det første i filen hed:
open(GW2,"$BaseDir/$DataFile2"); @lines2 = <GW2>; close GW2;
open (GB2,">$BaseDir/$DataFile2"); $f="nyheder/$in{'Filename'}"; foreach $line2 (@lines2) { chop $line2; @TempData2 = split (/\t/, $line2);
if ($TempData2[0] =~ /$f$/) { print GB2 "$line2\n"; } } close GB2;
Ups... jeg burde vist have skiftet til nicket for min arbejdsplads... nå men bare så du ved det: nvr er når jeg har arbejdskasketten på og shifter er hjemme i privaten! :)
HVis der ikke står tabuleringstegn i .txt filen kommer du ikke langt med at lave en split på et tabuleringstegn @TempData2 = split (/\t/, $line2); I mit eksempel var nvr.txt følgende: |nyheder/Detteerenoverskrift.shtml |1B8DB9|ffffff|Testoverskrift |nyheder/Detteerenoverskrift2.shtml |1B8DB9|ffffff|Testoverskrift2 hvor mellemrummene er et tabuleringstegn. Hvad har DU stående imellem?
Nå, ja forøvrigt - hvis der er syntaksfejl i sådan noget Perl-halløj, får man slet ikke sendt nogen header tilbage, og så giver den en fejl (500??). Test derfor lige dit script inden du sender det til serveren. Hvis jeg får tid, lægger jeg lige noget op på en server, som skulle virke.
Ok. På http://www.hasselager.net/nvr/nvr.pl ligger et program, der virker. Du kan indtaste den tekst, der skal slettes efter. På nvrpl.txt sammested kan du se programmet, og input.filen nvr.txt kan du også se. Output-filen nvrny.txt er også tilgængelig. Hav det sjovt.
Altid en fornøjelse. Chop bruger man normalt til at fjerne linieskiftet i enden af en linie. Men den er jo fjernet, når man læser ind med @lines = <...>. Men, jeg havde lavet filen under DOS (det nogle kalder Windows), og den sætter både CR og LF på. Scriptet kørte på UNIX hvor Perl fjernede det ene selv, og jeg det andet med chop.
Chop er lidt dum, for den fjerner ALTID det sidste tegn uanset hvad det er. Men den er så nem...
Fra før verden gik af lave - da man kun brugte Perl på Unix - var det helt naturligt at bruge chop. I dag skal man tage højde for skøre operativsystemer som DOS (med varianter), og det er vel derfor man har opfundet noget så degenereret som chomp. Jo, jo, hvis den havde været nødvendigt, var den da smartere. :-)
Hvorfor ???? hedder overskriften på spørgsmålet "sletning af fil", når det handler om at slette en linie i en fil????
...og nu jeg alligevel ER blevet irriteret, så fatter jeg (stadig) ikke hvad smart der er i at svare i kommentarer ... det er tudse svært hurtigt at scanne sig frem til hvad der er accepteret svar, når det som her f.eks. lyder "Den der chop er vist overflødig. Prøv lige uden." eller endnu grimmere "svar" og lignende, fordi det rigtige svar er smidt i kommentarer :-(
Synes godt om
Ny brugerNybegynder
Din løsning...
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.