Forum: PC-Programmierung Perl Code - Zeilenweise einlesen - Werte speichern ---- Debian


von andy (Gast)


Lesenswert?

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";
}

von Martin (Gast)


Lesenswert?

das tut weh :)

von andy (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

willst du Perl lernen oder dir ein nützliches Tool schreiben?

von andy (Gast)


Lesenswert?

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.

von helfer (Gast)


Lesenswert?

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...

von 42 (Gast)


Lesenswert?

helfer schrieb:
> Ich versteh nicht was du da versuchst.
+1
Könnte es sein dass du die Funktion split() suchst?

von Martin (Gast)


Lesenswert?

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)

von andy (Gast)


Lesenswert?

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];

}

von helfer (Gast)


Lesenswert?

Oder einfach Anzahl Worte pro Zeile zählen?

perl -ne 's/\s+/ /g; print scalar split($_, " ");'

oder so, kanns gerade nicht testen.

von andy (Gast)


Lesenswert?

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.

von mio (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.