Aktuelle SeiteWähle Forum / Perl / Allgemeines zu Perl / Existenzprüfung
Existenzprüfung

Hallo zusammen
Ich bin Anfänger mit Perl.
Ich habe ein Vokabular V und eine Textdatei von 10 zeilen (jede Zeile ist ein Satz)
@Vokbular = (hans haben katze füttern sein)
beispieltext:
hans haben katze
sein katze
hans füttern katze
.....
Ich möchte folgendes pseudocode in perl schreiben:
foreach zeile in der textdatei
if word exists in Vokabular
save "1" in @Vokabular
else save "0"
so dass als Ausgabe:
0,0,1,0,1
1,1,1,0,0
1,0,1,1,0
Kann mir da jemand helfen das zu lösen ?
Danke
Leo
Trackback URL für diesen Beitrag:
http://community.perl.de/trackback/44
- Anmelden oder Registrieren um Kommentare zu schreiben
- 287 Aufrufe
-

Man braucht nicht unbedingt reguläre Ausdrücke:
#!/usr/bin/perluse warnings;
use strict;
my @txt = ("hans haben katze gern", "sein nicht diese katze", "hans füttern andere katze");
# Ginge auch: my @vokabular = qw(hans haben katze füttern sein);
my @vokabular = ("hans", "haben", "katze", "füttern", "sein");
my @out = ();
my ($i, $u, $o, $x, @a);
foreach $i (@txt) {
@a = split(" ", $i);
foreach $u (@a) {
$x = 0;
foreach $o (@vokabular) {
if ($o eq $u) {
$x = 1;
last;
}
}
push(@out, $x);
push(@out, ",");
}
pop(@out);
push(@out, "\n");
}
print join("", @out);
In der Sprache "Python" gibt es ein Konstrukt
if "katze" in vokabularliste:Sowas wollte ich auch gern in Perl haben. Hab's aber nicht gefunden. Hab daher selbst ein Modul "Acme::Pythonic::Functions" geschrieben. Damit sähe das z.B. so aus (scheint soweit zu funktionieren):
#!/usr/bin/perluse warnings;
use strict;
use Acme::Pythonic::Functions;
my @txt = ("hans haben katze gern", "sein nicht diese katze", "hans füttern andere katze");
my @vokabular = qw(hans haben katze füttern sein);
my @out = ();
foreach (@txt) {
foreach (split(" ", $_)) {
push(@out, isin(@vokabular, $_, "l"));
push(@out, ",");
}
pop(@out);
push(@out, "\n");
}
print join("", @out);
Ab Perl 5.10 gibt es auch den Smart-Match-Operator...
(ungetestet)
#!/usr/bin/perluse 5.010;
use strict;
use warnings;
my @txt = ("hans haben katze gern", "sein nicht diese katze", "hans füttern andere katze");
my @vokabular = qw(hans haben katze füttern sein);
for my $line ( @text ) {
my @words = split / /, $line;
my @out;
for my $word ( @words ) {
my $value = $word ~~ @vokabular ? 1 : 0;
push @out, $value;
}
print join ',', @out;
}
Für Perls < 5.10 gibt es "grep" und "any" aus List::MoreUtils
Perl-Magazin "$foo"
Perl-Nachrichten
Hi
Danke für eure Vorschläge.
Mein ziel war eigentlich 1 oder 0 immer in Vokabular zu schreiben. Die Beispieltexte haben verschieden Länge, manchmal nur 2 wörter, manchmal auch 4 wörter (die Länge ist unbekannt)
Z.B:
text:
hans haben katze
sein katze
hans füttern katze
my @Vokabular= qw (hans haben katze füttern sein)
mit der Prüfung :
foreach zeile in der textdatei
if word exists in Array Vokabular
save "1" in @Vokabular
else save "0" in @Vokabular
(1 und 0) werden nur im Array @Vokabular geschrieben
Das Output soll:
0,0,1,0,1
1,1,1,0,0
1,0,1,1,0
Danke
Hi again,
Danke noch mal für die Vorschläge.
Ich habe eure skripte bissl geändert und hab jetzt das Ergebnis.
Ich dachte mit solchen Aufgaben muss man unbedingt array-referenzen
verwerden.
Ich sehe dass es einfacher geht.
Besten Dank
Leo