Ich hab mir ein Perl Skript geschrieben, welches mir als erstes eine Textdatei zeilenweise einliest. Anschließend sollte er jede Zeile überprüfen. Überprüfung: Was zwischen Leerzeichen ist, speichert er im Array druff ab. Ich hab das Programm free "wegen dem Arbeitsspeicher" in die Datei test.txt umgeleitet "free > test.txt" Jedoch funktioniert das Programm nicht optimal...ich bekomme keine Werte zwischen den Leerzeichen angezeigt. Vielleicht weis jemand von Euch wo der Fehler liegt. Ich hab $i = 1; genommen, da ich es erstmal bei der ersten Zeile ausprobieren wollte. Cu Andy Hier der code: #!/usr/bin/perl @druff = (); my $puffer; $wert = 0; $prell_leer = 0; $prell_zeichen = 0; @text = (); $datei = "test.txt"; open (in,"<$datei") || die $!; while (<in>) { $a = $a + 1 ; print $_; $text[$a] = $_; } close in; $i = 1; for($ii=0; $ii < length($text[$i]) ; $ii++) { if (substr($text[$i],$ii,1) eq " ") { } else { $puffer = $puffer + substr($text[$i],$ii,1) ; $zwischenwert = $ii +1; if (substr($text[$i],$zwischenwert,1) eq " ") { $weiter = $weiter + 1; $druff[$weiter] = $puffer; $puffer = ""; } } } for($ii=0; $ii < $weiter ; $ii++) { print $druff[$ii]; print "\n"; }
und die Ausgabe, was dabei heraus kommt. Wiegesagt verwurschtele ich gerade nur die erste Zeile, daher $i = 1; root@iconnect-armel-squeeze:/home/andreas# ./uff.pl total used free shared buffers cached Mem: 253544 245324 8220 0 3672 190172 -/+ buffers/cache: 51480 202064 Swap: 195580 244 195336 total used free shared buffers cached 0 0 0 0
willst du Perl lernen oder dir ein nützliches Tool schreiben?
Hab mal allen Variabelen, strings, arrays richtig deklariert #!/usr/bin/perl @druff = (); my $puffer; $wert = 0; $prell_leer = 0; $weiter = 0; $prell_zeichen = 0; $a = 0; $ii = 1; @text = (); $datei = "test.txt"; open (in,"<$datei") || die $!; while (<in>) { $a = $a + 1 ; print $_; $text[$a] = $_; } close in; $i = 1; for($ii=1; $ii <= length($text[$i]) ; $ii++) { if (substr($text[$i],$ii,1) eq " ") { } else { $puffer = $puffer + substr($text[$i],$ii,1) ; $zwischenwert = $ii +1; if (substr($text[$i],$zwischenwert,1) eq " ") { $weiter = $weiter + 1; $druff[$weiter] = $puffer; $puffer = ""; } if ($ii == length($text[$i])) { $weiter = $weiter + 1; $druff[$weiter] = $puffer; $puffer = ""; } } } for($ii=1; $ii <= $weiter ; $ii++) { print $druff[$ii]; print "\n"; } Die Ausgabe: root@iconnect-armel-squeeze:/home/andreas# ./uff.pl total used free shared buffers cached Mem: 253544 245324 8220 0 3672 190172 -/+ buffers/cache: 51480 202064 Swap: 195580 244 195336 0 0 0 0 0 0 Also die erste Zeile hat 6 Wörter...aber warum 6 Nullen? substr() funktioniert nicht richtig.
Ich versteh nicht was du da versuchst. Dein Code ist auch recht übel, vermutlich geht das mit einzwei regex sehr elegant, hab aber nicht kapiert was du erreixhen möchtest...
helfer schrieb: > Ich versteh nicht was du da versuchst. +1 Könnte es sein dass du die Funktion split() suchst?
andy schrieb: > for($ii=1; $ii <= length($text[$i]) ; $ii++) sicher <= ich glaub Perl beginnt ab 0 das ganze Programm sollte ein Einzeiler sein. Dein Paradigma passt eher zu Pascal oder C.
1 | $ echo 'hallo "du" liebe "welt"' | python -c "import sys, re; print re.findall(r'\".*?\"', sys.stdin.read())" |
2 | ['"du"', '"welt"'] |
lerne lieber etwas sauberes, Ruby oder Python wenn Perl, dann Perl6 (ohne Perl5 Balast)
Es funktioniert jetzt endlich.. #!/usr/bin/perl use strict; use warnings; my @druff = (); my $puffer; my $wert = 0; my $prell_leer = 0; my $weiter = 0; my $prell_zeichen = 0; my $a = 0; my $ii = 1; my $i = 1; my @text = (); my $datei = "test.txt"; my $zwischenwert = 0; open (in,"<$datei") || die $!; while (<in>) { $a = $a + 1 ; print $_; $text[$a] = $_; } close in; $i = 1; for($ii=1; $ii <= length($text[$i]) ; $ii++) { if (substr($text[$i],$ii,1) eq " ") { } else { $puffer .= substr($text[$i],$ii,1) ; $zwischenwert = $ii +1; if (substr($text[$i],$zwischenwert,1) eq " ") { $weiter = $weiter + 1; $druff[$weiter] = $puffer; $puffer = ""; } if ($ii == length($text[$i])) { $weiter = $weiter + 1; $druff[$weiter] = $puffer; $puffer = ""; } } } for($ii=1; $ii <= $weiter ; $ii++) { print $druff[$ii]; }
Oder einfach Anzahl Worte pro Zeile zählen? perl -ne 's/\s+/ /g; print scalar split($_, " ");' oder so, kanns gerade nicht testen.
noch mal danke an Euch. ich wusste nicht, das ich use strict; includieren musste...scheint eine Headerdatei zu sein....des weiteren musste ich jede Variabele, String u. Array my davor schreiben.
Oder so... Code:
1 | #!/usr/bin/perl
|
2 | use strict; |
3 | my @result = split(/[ \n]+/, join(" ", <>)); |
Aufruf:
1 | cat test.txt | ./script.pl |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.