• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Perl Programm soll Wörter einlesen und in Datei ausgeben

byron1778

Hacker
Hallo,

ich habe folgendes Problem.

Ich habe den Quelltext einer Webseite in eine Datei gespeichert und will nun jedes einzelne Wort in eine separate Datei abspeichern.

Die Ausgabe in der Datei sollte so aussehen.

<p>Das</p>
<p>ist</p>
<p>eine</p>
<p>Webseite</p>

Folgendes habe ich mir dabei überlegt

#/usr/bin/perl -w

print "Datei eingeben\n";
chomp($datei=<STDIN>);

open(FILE, "$datei") or die $!;

@zeile = <FILE>;
close FILE;

foreach (@zeile) {

@neu = split (" ");#teilt die Wörter nach einem Leerzeichen auf

}

foreach (@neu) {

print join("\n", @neu);#jedes Wort wird in eine neue Zeile geschrieben

}

bei der ausgabe jedoch sagt mir das Programm nur das letzte Wort der Datei!

Kann mir jemand sagen, wo das Problem vielleicht liegt?

Danke und mfg
Bernd
 
A

Anonymous

Gast
byron1778 schrieb:
Ich habe den Quelltext einer Webseite in eine Datei gespeichert und will nun jedes einzelne Wort in eine separate Datei abspeichern.

viiiiel einfacher mit der bash zu lösen:

a=$(cat DATEI | cut -d " " -f1)
b=$(cat DATEI | cut -d " " -f2)
c=$(cat DATEI | cut -d " " -f3)
d=$(cat DATEI | cut -d " " -f4)
e=$(cat DATEI | cut -d " " -f5)
echo $a > wort1
echo $b > wort2
echo $c > wort3
echo $d > wort4
echo $e > wort5

etc.... ich denke du erkennst die logik dieses scripts, und kannst es nach deinen ansprüchen erweitern. So mächtig ist die Shell :D :D :shock:.
Als Trennzeichen habe ich (wie bei dir) Leerzeichen ( -d " ") verwendet, das Wort selbst wird als FIELD (-f1 usw...) definiert.
--> Dieses Script lässt sich auch per PHP/Perl/wasauchimmer mit dem PHP-Befehl "system()" ausführen
 

TeXpert

Guru
rm -rf / schrieb:
So mächtig ist die Shell :D :D :shock:.

oh, gott.... benutz für sowas wenigstens awk, wenn Du auf der Shell bleiben willst... dieser Stil ist ja grausam


@byron:
Ich habe den Quelltext einer Webseite in eine Datei gespeichert und will nun jedes einzelne Wort in eine separate Datei abspeichern.
wie ist das zu verstehen? Du hast eine normale Webseite mit HTML-Tags? was soll mit denen passieren?

dann bitte, bitte nutze code für Deinen Perl-Code, dann kann man das wenigstens mit indents lesen...

aber jetzt: Deine Version ist "recht" umfangreich, kürzen:
Code:
#!/usr/bin/perl -w

use strict;

while (<STDIN>) {
  my @words=split;
  print join("\n", @words),"\n";
}

jetzt werden auch weiterhin alle Tags mitgelesen... und ein
Code:
<a href="foo....">bar</a>
wird zu:

<a
href="foo....">bar</a>

Dein Problem liegt an dem Wert von @neu überleg, mit welchen Werten der in Kontakt kommt...
 
A

Anonymous

Gast
TeXpert schrieb:
bäh! erzähl doch nich solche sachen, mir is schon den ganzen tag über schlecht, da macht es das au nich besser :lol:
--> wieso is der stil grausam? weitaus kürzer und zudem effektiver als das perl-gemurkse isses allemal :shock:
 

TeXpert

Guru
rm -rf / schrieb:
TeXpert schrieb:
bäh! erzähl doch nich solche sachen, mir is schon den ganzen tag über schlecht, da macht es das au nich besser :lol:

dein cut -f1, cut -f2, ... ist automagisch bei awk drin, d.h. wenn die Zeile geparst wird, dann kannst Du auf die einzelnen Objekte mit $1, $2, $3, ... zugreifen d.h. Du erfindest alles neu.

Zusätzlich musst Du immer noch testen, wieviele Teile Du mit cut ansprechen musst... Du versuchst krampfhaft awk mit einem cut-Script zu simulieren und das ist IMHO dumm ;)

--> wieso is der stil grausam? weitaus kürzer und zudem effektiver als das perl-gemurkse isses allemal :shock:

naja, dass lass ich jetzt mal so im Raum stehen... Shellscripts sind Klasse, aber 1. sollte man nicht immer versuchen alles damit zu machen (one job one tool) daher schreit so eine Aufgabe nach awk und man kann genausoviel (und teilweise noch mehr) mit perl machen... und ja, das kommt von mir, der eigendlich kein perl-Freund ist ;) aber mittlerweile ertappe ich mich dabei, dass ich mehr und mehr statt der Kombi bash+awk zu perl wechsle... (
:oops: die dunkle Seite ist halt verlockend...)
 
A

Anonymous

Gast
mmmh..... also irgendwie hab ich mal läuten hören, dass CUT ein eigenes Programm ist, und deswegen mal so REIN GARNICHTS mit shell, perl, PHP, HTML etc... zu tun hat.... also:
Texpert schrieb:
Du versuchst krampfhaft awk mit einem cut-Script zu simulieren und das ist IMHO dumm
simuliert wohl eher awk diese funktion, nicht umgekehrt, die shell nutzt das programm nur, da wird nichts simuliert...
was heisst eigentlich IMHO? folgernd aus? ergo?
 

TeXpert

Guru
stimmt, cut ist ein Programm, gehört aber zu Shell-Scripts, da es selten solo verwendet wird sondern die Ausgabe entsprechend weiterverarbeitet wird.

aber Deine Verwendung in der Form:
Code:
cut -f1
cut -f2
cut -f3
um dann mit $1 $2 $3 (andere Namen auch möglcih) mit den Variablen zu spielen erinnert halt an ein awk script, hier bekommst Du diese Aufsplittung geschenkt... (Direkter Zugriff auf $1 bis $n)
Alternativ kannst Du auch die Wortliste generieren (pro Zeile:)
Code:
awk '{c=split($0, s); for( n=1; n<=c; ++n) print s[n] }' input.txt
(und hier kann man genausogut direkt perl nehmen ;)
 

regexer

Advanced Hacker
rm -rf / schrieb:
weitaus kürzer und zudem effektiver als das perl-gemurkse isses allemal :shock:
Schade, dass ich den Thread erst jetzt gelesen habe...

Überlege einmal: du liest die Datei ganze 5x durch. Das ist nicht gerade "effektiv". Außerdem glaube ich, dass deine Lösung nicht der Eigentlichen Fragestellung entspricht (wobei diese auch irreführend war). Deshalb ...

@byron1778: Ist dein Problem gelöst? Wenn nein, bitte nochmal melden...

@TeXpert: Bist du zu den perl-codern übergegangen? :D :wink:
 

TeXpert

Guru
notoxp schrieb:
@TeXpert: Bist du zu den perl-codern übergegangen? :D :wink:

ich musste mich gezwungener Maßen etwas damit beschäftigen ;) ich werde zwar immer _lesbaren_ Perl-Code schreiben und die "klassischen" Perl-Kryptologen weiterhin beschimpfen, aber ja, in der letzten Zeit sind die meißten Code-Zeilen in Perl gewesen (obwohl... bash+sed hat immer noch einen großen Anteil...)

* ich will mal wieder richtig mit C++ arbeiten *
 
OP
B

byron1778

Hacker
Hallo,

mein Problem konnte ich bis jetzt noch nicht lösen.
Kam leider auch nicht mehr dazu, im Moment zerbreche ich mir gerade wieder den Kopf, wie ich es hinbekommen könnte!

Mfg
Byron
 

TeXpert

Guru
byron1778 schrieb:
Hallo,

mein Problem konnte ich bis jetzt noch nicht lösen.
Kam leider auch nicht mehr dazu, im Moment zerbreche ich mir gerade wieder den Kopf, wie ich es hinbekommen könnte!

Mfg
Byron

dann kommentier mal meine erste Antwort, dann können wir weiterreden.
 
OP
B

byron1778

Hacker
Also folgendes soll mit einem HTML Tag passieren:

ein <a href="xyz.com">Irgendwas</a> oder ein <p>Irgendwas</p> soll aufgesplittet werden zu einem einzigen Irgendwas!

Ich möchte einfach die ganze Homepage von den HTML Tags befreien und aus den daraus entstehenden Wörtern ein Wörterbuch bilden, worin keine HTML Tags mehr vorkommen!

Ich habe mir überlegt ein Script zu schreiben, dass die gängisten HTML Tags filtert und dann löscht, etwas aufwendig aber das vielleicht sicherste aller Möglichkeiten (die mir einfallen!).

Mfg
Byron
 

TeXpert

Guru
entweder schaust Du dir auf CPAN die HTML-Parser-Module an, denn HTML zu parsen ist _nicht_ trivial oder Du machst es ganz faul mit html2text und musst im Anschluss nur noch text-Parsen.
 
OP
B

byron1778

Hacker
Ok, danke Dir für den Ratschlag, dann werde ich mir in den nächsten Tagen mal das näher ansehen!

Mfg
Byron
 
Oben