CactuzMedlem sedan okt. 2001670 inlägg nu använder jag den här koden
open(FILE, "<$lfile");
@rad = <FILE>;
close(FILE);
foreach (@rad) {
($var1,$var2,$var3,$var4) = split(/ :/, $_);
if($var4 eq 'TEST'){
} else {
print("$_ - $var1,$var2,$var3,var4\n");
}
}
Men nu skriver den ut alla rader sen kör den - $var1,$var2,$var3,var4 på en rad.
JojoxxMedlem sedan juni 20004 308 inlägg Om vi tänker oss att data-filen ser ut så här;
1 :2 :3 :4
A :B :C : DATA
5 :6 :7 :8
(Det skall inte vara ett mellanslag mellan : och "DATA", men förumet gör om denna kombination till :DATA)
Så innehåller ju inte $var4 på andra raden bara "DATA" utan "DATA[radbrytning]". Denna kan du plocka bort genom att använda kommandot "chomp" (som tar bort sista logiska tecknet i en sträng ifall det är en radbrytning).
foreach (@rad) {
chomp;
# ...osv
(Sedan fattas det ett $ före "var4" på print-raden :) )
CactuzMedlem sedan okt. 2001670 inlägg Men jag gjorde om variablerna lite bara.. jag ville inte ge ut dom :)
CactuzMedlem sedan okt. 2001670 inlägg Och den skriver fortfarande ut (om jag ska följa ditt exempel)
1 :2 :3 :4
A :B :C : DATA
5 :6 :7 :8
$var1 - $var1,$var2,$var3,var4\n
eller nåt liknande... Jag vill att den ska skriva ut
1 :2 :3 :4
$var1,$var2,$var3,var4\n
A :B :C : DATA
$var1,$var2,$var3,var4\n
5 :6 :7 :8
$var1,$var2,$var3,var4\n
JojoxxMedlem sedan juni 20004 308 inlägg Ursäkta, jag missade att du jämförde med 'TEST' i koden och inte 'DATA'. Vet inte var jag fick DATA från :), men jaja.
Det du gör i koden är ju att kolla om $var4 är lika med "TEST". I så fall görs ingenting (eftersom det enda du gör ligger i else-satsen). Alltså, i alla fall där $var4 INTE är lika med "TEST" skriver du ut den inlästa raden förljt av " - " och de 4 variablerna du nyss skapat med split, separerade av komma (om vi bortser från att du missat $ för var4). Sist kommer en radbrytning. Alltså kommer allt att skrivas på en rad (för varje inläst text-rad som stämmer if-satsen). Vill du ha varje rad från text-filen bli 2 rader i output'en får du slänga in en radbrytning till. Så långt fungerar scriptet. Sedan får du tänka på att om du skickar detta till en webbläsare som kommer allt att visas på en och samma rad i alla fall eftersom webbläsaren läser html, där radbrytning är "<br>", men det ser du ju genom att "visa källa".
CactuzMedlem sedan okt. 2001670 inlägg Men jag skickar det över IRC :)
Men jag tar det från början...
Jag behöver ett script som går igenom rad för rad i ett textdokument och om t.ex rade är hej så ska den gör nåt annars ska den t.ex bara skriva ut raden som den är.
JojoxxMedlem sedan juni 20004 308 inlägg Visst, du är helt på rätt väg. $_ är ju som bekant en underförstådd variabel i perl, men för att vi inte skall tappa bort den någonstanns i hanteringen (om du lägger till fler saker i loopen som påverkar $_) så byter vi ut den mot en vanlig variabel.
foreach $this (@rad){
chomp $this;
if($this eq "hej"){
#Gör något.
} else {
print $this;
}
}
Men tänk på att perl hanterar radbrytningar som logiska tecken. D.v.s., kör du scriptet på ett windows-baserat system kommer [cr][lf] (alltså 2 tecken) att ses som ett logiskt tecken, nämligen "radbrytning". Chomp ex. kommer alltså egentligen att plocka bort 2 tecken. Detta för att det skall bli enklare att programmera och det är enklare att flytta scriptet mellan olika system. Problem kan dock uppstå om du kör scriptet på en Unix-burk och text-filen kommer från en windows-maskin. Enklast i så fall är att se till att filen sparas i *nix-format (med bara [lf] som radbrytning).
CactuzMedlem sedan okt. 2001670 inlägg När jag kör den här koden:
open(FILE, "text.txt");
@rad = <FILE>;
close(FILE);
foreach (@rad)
{
chomp $_;
if($_ eq "$test")
{
print "hurra.. det stämde\n";
} else {
print "skit också\n";
}
}
så blir $_ inehållet i hela filen och inte bara den aktuella raden. "foreach" körs också naturligtvis också bara en gång då.
JojoxxMedlem sedan juni 20004 308 inlägg Ett tänkbart fel är att text.txt är genererad/redigerad på ett windows-system (och har radbrytningssekvensen [cr][lf]) och scriptet körs på någon unix-dialekt som används [lf]. Perl använder nämligen logiska radbrytningar, d.v.s. körs scriptet under windows syftar "\n" på "[cr][lf] medans om scriptet körs under unix blir det "[lf]" (och under mac "[cr]"). Kan det stämma? I lite mer fullfjädrade edtiorer kan du välja vilket format du vill spara, så även under windows kan du skapa en unix-lik text-fil.
CactuzMedlem sedan okt. 2001670 inlägg Filen är sparad under windows (anteckningar) och används under windows med ett script som körs av activeperl
JojoxxMedlem sedan juni 20004 308 inlägg ... enda sättet jag kan få fram fenomenet i ActivePerl (kör build 633) är att tvinga min editor att spara text-filen i mac(!) format, alltså endast [cr] som radbrytning. Både [lf] och [cr][lf] funkar fina fisken.
Har du möjlighet att spara om text-filen i olika format (unix/windows), bara för att testa?
Vad har du för version och build av ActivePerl?
HansenMedlem sedan aug. 2000374 inlägg Kastar mig in, dock inte riktigt säker på vad du söker.
#!/usr/bin/perl
use strict;
use warnings;
while ( <DATA> ) {
chomp;
if ( /hansen/i ) {
print ".. processa data ..\n";
next;
}
print $_, "\n";
}
__DATA__
Cactuz:123456
Hansen:123456
Jojoxx:123456
Output:
Cactuz:123456
.. processa data ..
Jojoxx:123456