Wie durchsuche ich einen Hash in Perl?

Hallo,
in meinem Programm (in Perl geschrieben) möchte ich einen Hash, der sieht so aus:

234 => Obamas administration

nach den Stopwörtern durchsuchen die in einem Array liegen, und die Strings die diesen enthalten entfernen.
Habe mit grep-Funktion probiert, funktionert nur für einwörtige Strings.

$k=0;
 foreach $foo (sort { $hash{$b}$hash{$a} } keys %hash) {
 while($foo =~ /(.\*)\s(.\*)/){
 if (grep {$\_ eq $1 or $\_ eq $2} @stopliste)
 {
 } #nichts tun, wenn Wort in Stopliste enthalten ist.
 else {
 if($hash{$foo} \>= 1){
 print "$hash{$foo} =\> join($1, $2\n)";
 $k++;
 }
}
}
}

Was ist da falsch???

Bin für jeden Vorschlag dankbar.

_[MOD]:

-Tags hinzugefuegt, bitte in Zukunft selbst machen_ 

Hallo,

in meinem Programm (in Perl geschrieben) möchte ich einen
Hash, der sieht so aus:

234 => Obamas administration

Also die Zahl ist der key, und der Text der Wert?

nach den Stopwörtern durchsuchen die in einem Array liegen,

Leg sie doch in ein Hash, dann musst du nicht durchsuchen sondern kannst Direktzugriffe darauf machen.

und die Strings die diesen enthalten entfernen.
Habe mit grep-Funktion probiert, funktionert nur für
einwörtige Strings.

$k=0;
foreach $foo (sort { $hash{$b}$hash{$a} } keys %hash) {
while($foo =~ /(.*)\s(.*)/){
if (grep {$_ eq $1 or $_ eq $2} @stopliste)
{
} #nichts tun, wenn Wort in Stopliste enthalten
ist.

Vermutlich wuerde sowas besser passen:

while ($foo =~ /(\w+)/g) {
 if (!exists $stoppwords{$1}) {
 # do stuff here
 }
}

Gruesse,
Moritz

[MOD]: markup fix

Hallo,

in meinem Programm (in Perl geschrieben) möchte ich einen
Hash, der sieht so aus:
234 => Obamas administration

nach den Stopwörtern durchsuchen die in einem Array liegen,
und die Strings die diesen enthalten entfernen.
Habe mit grep-Funktion probiert, funktionert nur für
einwörtige Strings.

grep funktioniert manchmal auch mit mehreren „Worten“.

In Ergänzung (bzw. Erweiterung) zu Moritz’ letztem Beispiel
würde ich wie folgt vorgehen:

 ...
 # Vorhandene Stopliste:
 my @stoplist = (..., ..., ...);
 # in Hash umwandeln und jeweils 0 setzen (Perl-idiom):
 my %stophash;
 @stophash{@stoplist} = (0) x @stoplist;

 # Text (Hashvalue) loeschen - wenn in Stopliste
 for my $v (values %hash) {
 $v = undef if grep exists $stophash{$\_}, $v =~ /\w+/g;
 }

Das isses schon. Nun kannst Du alle „ungelöschten“
Einträge ausdrucken:

 ...
 # print undeleted
 print "$\_ =\> $hash{$\_}\n" 
 for grep defined $hash{$\_}, keys %hash;
 ...

aber auch alle gelöschten Einträge bestimmen:

 ...
 # print deleted
 print "$\_ =\> [deleted]\n" 
 for grep !defined $hash{$\_}, keys %hash;
 ...

Grüße

CMБ

Hallo Semjon Michailovich,

erstens Danke für den Tipp, aber es funkzioniert irgendwie nicht so wie ich es mir vorstelle. Möglicherweise habe ich nicht genau erklärt, was das Programm soll: es sollen diejeniege Phrasen aus dem Hash gelöscht werden bei dennen die eine oder die andere Komponente in der Stopwortliste enthalten sei.

@stophash{@stoplist} = (0) x @stoplist;

Ich hätte noch die Frage:
erstellt diese Zeile alle möglichen Kombinationen aus dem Array?

Gruss,

Krokodil Gena.

Hallo

erstens Danke für den Tipp, aber es funkzioniert irgendwie
nicht so wie ich es mir vorstelle. Möglicherweise habe ich
nicht genau erklärt, was das Programm soll: es sollen
diejeniege Phrasen aus dem Hash gelöscht werden bei dennen die
eine oder die andere Komponente in der Stopwortliste enthalten
sei.

Dann ist es am besten, Du zeigst mal die Daten
(oder ein paar davon - womit es gehen würde wenn
es gehen würde) hier im Forum und eine kurze
Beschreibung was rauskommen soll.

@stophash{@stoplist} = (0) x @stoplist;

Ich hätte noch die Frage:
erstellt diese Zeile alle möglichen Kombinationen aus dem
Array?

Das erzeugt einen Hash (ein Dictionary bzw. Lookup-Table),
bei dem die Array-Elemente die „Keys“ und ‚0‘-en die
„Values“ sind. In diesem Fall können die „Values“ jeden
Wert haben der von ‚undef‘ verschieden ist., man könnte
die values auch zum Aufaddieren der „Treffer“ benutzen.

Der Ausdruck: (0)
ist eine Liste von Nullen mit einem Element,
ein Ausdruck: (0) x 2
erzeugt eine Liste mit zwei Nullen: (0, 0)
und: (0) x @stoplist
erzeugt eine Liste mit soviel Nullen, wie das
Array @stoplist Elemente hat, also
wörtlich: (0) SOOFT_WIE scalar(@stoplist)

Grüße

CMБ

Hallo

Dann ist es am besten, Du zeigst mal die Daten
(oder ein paar davon - womit es gehen würde wenn
es gehen würde) hier im Forum und eine kurze
Beschreibung was rauskommen soll.

Mein Programm extrahiert eine Liste von Nominal Phrasen, diese enthält allerdings diejenige die ich aussortieren will. Ich habe eine Liste von Stopwörtern erstellt, um die „unerwüschte“ auszusortieren.

Output:
other investment => 1
selection committee => 1
future job => 1
select committee => 1

Diese hier möchte ich weghaben:
future job => 1
other investment => 1

In der Liste aber nur:
other
future

aber keine: job oder investment.
D.h. das falls eines der Wörtern in Stopliste erhalten sei, soll die ganze Phrase weg.

Gruss,

Krokodil Gena.

Hallo

Mein Programm extrahiert eine Liste von Nominal Phrasen, diese
enthält allerdings diejenige die ich aussortieren will. Ich
habe eine Liste von Stopwörtern erstellt, um die „unerwüschte“
auszusortieren.

Output:
other investment => 1
selection committee => 1
future job => 1
select committee => 1

Diese hier möchte ich weghaben:
future job => 1
other investment => 1

In der Liste aber nur:
other
future

Aha, also etwa so (?):

...

my %output = map +($\_, 1), (
 'other investment',
 'selection committee',
 'future job',
 'select committee'
);

 # Vorhandene Stopliste als Hash 
my %stop = map +($\_, 0), (
 'other',
 'future'
);

for my $k (keys %output) {
 $output{$k} = 0 if grep exists $stop{$\_}, $k =~ /\w+/g;
}

print "undeleted:\n";
print "$\_ \n" for grep $output{$\_}, keys %output;

print "deleted:\n";
print "$\_ =\> \n" for grep !$output{$\_}, keys %output;

...

Grüße

CMБ

Hallo,

vielen vielen Dank!
Das funktioniert hervorragend, sogar für die Phrase der Länge > 2, genau das, was ich gebraucht habe!!!

Gruss,

Krokodil Gena.