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

Existenzprüfung


Bild von Leoc

By Leoc - Posted on 09 März 2010

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
0
Eigene Bewertung: Keine

Man braucht nicht unbedingt reguläre Ausdrücke:
#!/usr/bin/perl
use 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/perl
use 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/perl

use 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

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