Map-Funktion

Hallo Perl-Experten!

kann leider immer noch nicht begreifen wie map funktioniert -(

habe folgenden Code geschrieben, das die Strings eines Arrays an den Leerzeichen zerlegt, auf die Singularform normalisiert, zusammenfügt und ausgibt:
#####################################
my @words = („applied mathematics“, „unique terms“, „global weights“, „additional uses“);
my $new_string;
foreach my $string (@words)
{
$new_string = join ’ ', map { &stem() } split( / /, $string);
print „$new_words\n“;
}
#########################################

sub stem
{
my $word = $_;
my @stopliste = („measles“, „news“, „billiards“, „mumps“);
while($word)
{
if (grep {$_ eq $word} @stopliste)
{
$word = $word;
}
else {
if($word =~ /(ies|men|ics|(o|t|d|l|m|n|a|e|u|b|p|k|g|r|w|)s|(x|ss|sh|ch|x|s)es)$/)
{
$word =~s/(men)$/man/gos;
$word =~s/(ies)$/y/gos;
$word =~s/(ics)$/ics/gos;
$word =~s/(es)$//gos;
$word =~s/(s)$//gos;
}
else {
$word = $word;
}
}
}
return $word;
}
###################################################

meines Erachtens sollte alles unproblematisch laufen, ist aber nicht so
das Programm hängt in der Zeile mit map.
Könnte mir vielleicht jemand erklären, was da nicht stimmt???

Gruss,

Krokodil Gena

Hallo

kann leider immer noch nicht begreifen wie map funktioniert -(
habe folgenden Code geschrieben, das die Strings eines Arrays
an den Leerzeichen zerlegt, auf die Singularform normalisiert,
zusammenfügt und ausgibt:
#####################################
my @words = („applied mathematics“, „unique terms“, "global
}
###################################################

meines Erachtens sollte alles unproblematisch laufen, ist aber
nicht so das Programm hängt in der Zeile mit map.
Könnte mir vielleicht jemand erklären, was da nicht stimmt???

Du kannst nicht $_ implizit übergeben, dann
in der Funktion verändern und hoffen, daß
alles noch funktioniert. $_ wird nicht so
‚localized‘.

Ich hab mal auf die Schnelle einige kleine
Änderungen eingebaut, glaube aber nicht,
daß Dein regulärer Ausdruck in der
Funktion stimmt.

use strict;
use warnings;

my @words = ('applied mathematics', 'unique terms', 'global weights', 'additional uses');
my @stoplist = ('measles', 'news', 'billiards', 'mumps');

foreach my $string (@words) {
 my $new\_string = join ' ', map stem($\_), split /\s+/, $string;
 print "$new\_string\n";
}

sub stem {
 my $word = shift;
 unless (grep $\_ eq $word, @stoplist) {
 my $reg = qr{ (ies|men|ics
 | (o|t|d|l|m|n|a|e|u|b|p|k|g|r|w|)s
 | (x|ss|sh|ch|x|s)
 es)
 $ }x;

 if($word =~ /$reg/) {
 $word =~ s/men$/man/g;
 $word =~ s/ies$/y/g;
 $word =~ s/ics$/ics/g;
 $word =~ s/es$/e/g;
 $word =~ s/s$//g;
 }
 }
 return $word;
}

Grüße

CMБ

Hallo

Ich hab mal auf die Schnelle einige kleine
Änderungen eingebaut, glaube aber nicht,
daß Dein regulärer Ausdruck in der
Funktion stimmt.

Tausend Dank!
(der Reguläre Ausdruck stimmt wircklich nicht, habe ihn schon geändert.)

Gruss,

Krokodil Gena.